SQLProcedure-获取过程名称列表

SQLProcedures() 返回已在系统上注册并与指定搜索模式匹配的过程名称的列表。

将在 SQL 结果集中返回此信息,可以使用用于处理查询生成的结果集的相同函数来检索此信息。

Unicode (UTF-16) 等效: 此函数还可以与 Unicode (UTF-16) 字符集配合使用。 相应的 Unicode 函数是 SQLProceduresW() 。有关 DB2® CLI 的 Unicode 支持的更多信息,请参阅 Db2 for i CLI 中的 Unicode

语法

SQLRETURN   SQLProcedures    (SQLHSTMT          StatementHandle,
                              SQLCHAR           *CatalogName,
                              SQLSMALLINT       NameLength1,
                              SQLCHAR           *SchemaName,
                              SQLSMALLINT       NameLength2,
                              SQLCHAR           *ProcName,
                              SQLSMALLINT       NameLength3);

函数自变量

表 1. SQL过程参数
数据类型 自变量 使用 描述
SQLHSTMT StatementHandle 输入 语句句柄。
SQLCHAR * CatalogName 输入 3 部件过程名称的目录限定符。

这必须是 NULL 指针或零长度字符串。

SQLSMALLINT NameLength1 输入 CatalogName的长度。 此值必须设置为 0。
SQLCHAR * SchemaName 输入 可能包含 pattern-value 以按模式名称限定结果集的缓冲区。

对于 DB2 for z/OS® 和 OS/390® V 4.1,所有存储过程都在一个模式中; SchemaName 自变量的唯一可接受值是空指针。 对于 DB2, SchemaName 可以包含有效的模式值。

SQLSMALLINT NameLength2 输入 SchemaName的长度。
SQLCHAR * ProcName 输入 可能包含 pattern-value 以限定 procedure 名称的结果集的缓冲区。
SQLSMALLINT NameLength3 输入 ProcName的长度。

用法

SQLProcedures() 返回的结果集包含按给定顺序列示在 表 2 中的列。 这些行按 PROCEDURE_CAT , PROCEDURE_SCHEMA 和 PROCEDURE_NAME 进行排序。

因为在许多情况下,对 SQLProcedures() 的调用会映射到针对系统目录的复杂且昂贵的查询,所以请谨慎使用这些查询,并保存结果,而不是重复调用。

虽然可能会添加新列,并且在将来的发行版中可能会更改现有列的名称,但当前列的位置不会更改。

表 2。 SQL过程返回的列
列号/名称 数据类型 描述
1 进程 DURE_CAT VARCHAR(128) 当前服务器。
2 进程 SCHEM VARCHAR(128) 包含 PROCEDURE_NAME 的模式的名称。
3 进程名称 VARCHAR(128) NOT NULL 过程的名称。
4 输入参数数 INTEGER NOT NULL 输入参数的数目。
5 输出参数数 INTEGER NOT NULL 输出参数的数目。
6 结果集数 INTEGER NOT NULL 过程返回的结果集数。
7 备注 VARCHAR (254) 这包含有关该过程的描述性信息。
8 进程类型 SMALLINT 定义过程类型:
  • SQL_PT_UNKNOWN: 无法确定过程是否返回值。
  • SQL_PT_PROCEDURE: 返回的对象是一个过程; 即,它没有返回值。
  • SQL_PT_FUNCTION: 返回的对象是函数; 即,它具有返回值。
DB2 CLI 始终返回 SQL_PT_PROCEDURE。
注: Db2 for i CLI 使用的列名遵循 X/Open CLI CAE 规范样式。 列类型,内容和顺序与为 ODBC中的 SQLProcedures() 结果集定义的列类型,内容和顺序相同。

返回码

  • SQL_SUCCESS
  • sql_success_with_info
  • SQL_ERROR
  • sql_invalid_handle

错误状态

表 3. SQL过程 SQLSTAT
SQLSTATE 描述 说明
24000 游标状态无效 已在语句句柄上打开游标。
40003 08S01 通信链路故障 在功能完成之前,应用程序与数据源之间的通信链路发生故障。
HY001 内存分配失败 Db2 for i CLI 无法分配支持处理或完成功能所需的内存。
HY008 操作已取消  
HY010 函数顺序错误  
HY014 没有更多句柄 由于内部资源, Db2 for i CLI 无法分配句柄。
HY021 内部描述符无效 无法寻址或分配内部描述符,或者它包含无效的值。
HY090 无效的字符串或缓冲区长度 其中一个名称长度参数的值小于 0 ,但不等于 SQL_NTS。
HYC00 驱动程序不支持 Db2 for i CLI 不支持 catalog 作为过程名称的限定符。

连接的数据源不支持将模式作为过程名称的限定符。

HYT00 超时已到期  

限制

如果应用程序连接到不提供对存储过程目录的支持或不提供对存储过程的支持的 DB2 服务器,那么 SQLProcedureColumns() 将返回空结果集。

示例

注: 通过使用代码示例,您同意 代码许可证和免责声明信息的条款。
/* From CLI sample procs.c */
/* ... */
 
    printf("Enter Procedure Schema Name Search Pattern:\n");
    gets((char *)proc_schem.s);
 
    rc = SQLProcedures(hstmt, NULL, 0, proc_schem.s, SQL_NTS, (SQLCHAR *)"%", SQL_NTS);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, (SQLPOINTER) proc_schem.s, 129,
                    &proc_schem.ind);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    rc = SQLBindCol(hstmt, 3, SQL_C_CHAR, (SQLPOINTER) proc_name.s, 129,
                    &proc_name.ind);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    rc = SQLBindCol(hstmt, 7, SQL_C_CHAR, (SQLPOINTER) remarks.s, 255,
                    &remarks.ind);
    CHECK_HANDLE( SQL_HANDLE_STMT, hstmt, rc ) ;
 
    printf("PROCEDURE SCHEMA          PROCEDURE NAME            \n");
    printf("------------------------- ------------------------- \n");
    /* Fetch each row, and display */
    while ((rc = SQLFetch(hstmt)) == SQL_SUCCESS) {
        printf("%-25s %-25s\n", proc_schem.s, proc_name.s);
        if (remarks.ind != SQL_NULL_DATA) {
            printf("  (Remarks) %s\n", remarks.s);
        }
    }                           /* endwhile */

引用

SQLProcedureColumns -获取过程的输入/输出参数信息