DESCRIBE PROCEDURE 语句

DESCRIBE PROCEDURE语句用于获取存储过程返回的结果集的信息。 信息(例如结果集的数量)被放入描述符中。

调用 DESCRIBE PROCEDURE

此语句只能嵌入在应用程序中。 这是一个无法动态准备的可执行语句。

授权 DESCRIBE PROCEDURE

不需要执行任何操作。

语法 DESCRIBE PROCEDURE

阅读语法图跳过可视化语法图DESCRIBE PROCEDURE 程序名宿主变量 INTO描述符名称

描述 DESCRIBE PROCEDURE

过程名 宿主变量
标识返回一个或多个结果集的存储过程。 当执行DESCRIBE PROCEDURE语句时,存储过程名称必须标识请求者已经使用SQL CALL语句调用的存储过程。 程序名称可以由一个、两个或三个部分组成。 DESCRIBE PROCEDURE语句中的过程名称必须与CALL语句中指定的名称相同。 例如,如果在CALL语句中指定了由两部分组成的存储过程名称,则必须在DESCRIBE PROCEDURE语句中指定由两部分组成的存储过程名称。

如果使用主变量:

  • 它必须是一个字符串变量,长度属性不能超过254。
  • 其后不能跟指示变量。
  • 宿主变量的值取决于数据库服务器。 无论使用何种服务器,规格必须:
    • 在宿主变量中左对齐
    • 不包含嵌入的空格
    • 如果右边的长度小于宿主变量的长度,则用空白填充
例外: 更改开始上述语法适用于除REXX之外的所有语言。 对于REXX,语法为DESCRIBE PROCEDURE :hostvar更改结束
INTO descriptor-name
标识 SQL 描述符区域 (SQLDA)。 SQLDA返回的信息描述了存储过程返回的结果集。

分配和初始化 SQLDA 的注意事项与 DESCRIBE TABLE 类似。

有关执行DESCRIBE PROCEDURE语句后SQLDA的内容,请参阅 DESCRIBE PROCEDURE返回的SQLDA内容

备注 DESCRIBE PROCEDURE

DESCRIBE PROCEDURE返回的SQLDA内容

执行DESCRIBE PROCEDURE语句后,SQLDA的内容为:

  • SQLDAID字段的首5个字节被设置为“SQLPR”。

    REXX SQLDA 不包含 SQLDAID。

  • SQLDAID字段的第6至第8字节为保留字节。
  • SQLD字段设置为结果集总数。 字段中的值为0表示没有结果集。
  • 每个结果集对应一个SQLVAR条目。
  • 每个SQLVAR条目的SQLDATA字段被设置为与结果集关联的结果集定位符值。

    对于REXX SQLDA,SQLLOCATOR被设置为结果集定位符值。

  • 每个SQLVAR条目的SQLIND字段被设置为结果集中的估计行数

    对于REXX SQLDA,SQLIND字段不用于DESCRIBE。

  • SQLNAME字段设置为存储过程用于返回结果集的游标的名称。 此值以包含此语句的计划或包的编码绑定选项指定的编码方案返回。

SQLIND字段中的 -1 值表示未提供结果集中的估计行数。 Db2 for z/OS® 总是将SQLIND设置为。 -1 对于REXX SQLDA,SQLIND字段不用于DESCRIBE。

DESCRIBE PROCEDURE不返回存储过程所需的参数信息。

定位值分配

定位器值按照关联游标在运行时打开的顺序分配给SQLDA中的SQLVAR条目。 当控制权返回调用应用程序时,不向关闭的游标提供定位器值。 如果光标被关闭,然后在返回调用应用程序之前重新打开,则将使用光标最近执行的 OPEN CURSOR 语句来确定为过程结果集返回定位器值的顺序。 例如,假设程序 P1 打开三个游标A、B、C,关闭游标B,然后在返回调用应用程序之前为游标B发出另一个OPEN CURSOR语句。 定位器的数值按A、C、B的顺序分配。

或者,可以使用关联定位器语句将定位器值复制到结果集定位器变量中。

使用宿主变量:

如果描述过程语句包含宿主变量,则宿主变量的内容将采用绑定包含该语句的程序包或计划时在编码参数中指定的编码方案。

例子 DESCRIBE PROCEDURE

以下示例中的语句假定是在PL/I程序中。

示例1 :将存储过程 P1 返回的结果集信息放入 SQLDA1 命名的描述符中。 假设当前服务器 SITE2 以单部分名称调用存储过程。
   EXEC SQL CONNECT TO SITE2;
   EXEC SQL CALL P1;
   EXEC SQL DESCRIBE PROCEDURE P1 INTO :SQLDA1;
示例2 :重复示例1中的场景,但使用一个由两部分组成的名称来指定存储过程的显式模式名称,以确保使用模式MYSCHEMA中的存储过程 P1。
   EXEC SQL CONNECT TO SITE2;
   EXEC SQL CALL MYSCHEMA.P1;
   EXEC SQL DESCRIBE PROCEDURE MYSCHEMA.P1 INTO :SQLDA1;
示例3: 将存储过程返回的结果集信息(由主机变量 HV1 标识)放入由 SQLDA2 命名的描述符中。 假设宿主变量 HV1 包含值 SITE2.MYSCHEMA.P1 ,并且存储过程以三部分名称调用。
   EXEC SQL CALL SITE2.MYSCHEMA.P1;
   EXEC SQL DESCRIBE PROCEDURE :HV1 INTO :SQLDA2;
如果宿主变量 HV1 包含 MYSCHEMA.P1 (一个由两部分组成的名称)这个值,前面的例子将无效。 为了使主机变量 HV1 中的两部分名称有效,当前服务器必须与CALL语句中指定的位置名称相同,如下面的语句所示。 这是唯一不需要指定相同名称的情况,在CALL语句中使用三部分名称,在DESCRIBE PROCEDURES语句中使用两部分名称。
   EXEC SQL CONNECT TO SITE2;
   EXEC SQL CALL SITE2.MYSCHEMA.P1;
   EXEC SQL ASSOCIATE LOCATORS (:LOC1, :LOC2)
            WITH PROCEDURE :HV1;