DESCRIBE_COLUMNS 过程 - 检索 SELECT 列表中的列的描述
DESCRIBE_COLUMNS 过程能够通过游标检索 SELECT 列表中的列的描述。
语法
参数
- c
- 类型为 INTEGER 的输入自变量,用于指定要描述其列的游标的标识。
- col_cnt
- 类型为 INTEGER 的输出自变量,用于返回游标的 SELECT 列表中的列数。
- desc_tab
- 类型为 DESC_TAB 的输出自变量,用于描述列元数据。DESC_TAB 数组提供指定游标中的每列的信息。
权限
对 DBMS_SQL 模块的 EXECUTE 特权。
使用说明
此过程需要页大小为 4K 的用户临时表空间;否则它会返回 SQL0286N
错误。可使用此命令创建用户临时表空间:
CREATE USER TEMPORARY TABLESPACE DBMS_SQL_TEMP_TBSDESC_TAB
是一组有关列信息的 DESC_REC 记录:
| 记录名 | 描述 |
|---|---|
| col_type | C 和 C++ 嵌入式 SQL 应用程序中的受支持 SQL 数据类型中定义的 SQL 数据类型。 |
| col_max_len | 该列的最大长度。 |
| col_name | 列名。 |
| col_name_len | 列名的长度。 |
| col_schema | 始终为 NULL。 |
| col_schema_name_len | 始终为 NULL。 |
| col_precision | 按数据库中定义的列的精度。如果 col_type 表示图形或 DBCLOB SQL 数据类型,那么此变量指示列可保存的最大双字节字符数。 |
| col_scale | 按数据库中定义的列的小数位(仅适用于 DECIMAL、NUMERIC 和 TIMESTAMP)。 |
| col_charsetid | 始终为 NULL。 |
| col_charsetform | 始终为 NULL。 |
| col_null_ok | 可空指示符。如果该列可空,那么其值为 1,否则为 0。 |
ALTER MODULE SYSIBMADM.DBMS_SQL PUBLISH TYPE DESC_REC AS ROW
(
col_type INTEGER,
col_max_len INTEGER,
col_name VARCHAR(128),
col_name_len INTEGER,
col_schema_name VARCHAR(128),
col_schema_name_len INTEGER,
col_precision INTEGER,
col_scale INTEGER,
col_charsetid INTEGER,
col_charsetform INTEGER,
col_null_ok INTEGER
);
ALTER MODULE SYSIBMADM.DBMS_SQL PUBLISH TYPE DESC_TAB AS DESC_REC ARRAY[INTEGER]; 示例
示例 1:以下示例描述“EMP”表中的
empno、ename、hiredate 和
sal 列。
SET SERVEROUTPUT ON@
BEGIN
DECLARE handle INTEGER;
DECLARE col_cnt INTEGER;
DECLARE col DBMS_SQL.DESC_TAB;
DECLARE i INTEGER DEFAULT 1;
DECLARE CUR1 CURSOR FOR S1;
CALL DBMS_SQL.OPEN_CURSOR( handle );
CALL DBMS_SQL.PARSE( handle,
'SELECT empno, firstnme, lastname, salary
FROM employee', DBMS_SQL.NATIVE );
CALL DBMS_SQL.DESCRIBE_COLUMNS( handle, col_cnt, col );
IF col_cnt > 0 THEN
CALL DBMS_OUTPUT.PUT_LINE( 'col_cnt = ' || col_cnt );
CALL DBMS_OUTPUT.NEW_LINE();
fetchLoop: LOOP
IF i > col_cnt THEN
LEAVE fetchLoop;
END IF;
CALL DBMS_OUTPUT.PUT_LINE( 'i = ' || i );
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_name = ' || col[i].col_name );
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_name_len = ' ||
NVL(col[i].col_name_len, 'NULL') );
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name = ' ||
NVL( col[i].col_schema_name, 'NULL' ) );
IF col[i].col_schema_name_len IS NULL THEN
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name_len = NULL' );
ELSE
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_schema_name_len = ' ||
col[i].col_schema_name_len);
END IF;
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_type = ' || col[i].col_type );
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_max_len = ' || col[i].col_max_len );
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_precision = ' || col[i].col_precision );
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_scale = ' || col[i].col_scale );
IF col[i].col_charsetid IS NULL THEN
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetid = NULL' );
ELSE
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetid = ' || col[i].col_charsetid );
END IF;
IF col[i].col_charsetform IS NULL THEN
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetform = NULL' );
ELSE
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_charsetform = ' || col[i].col_charsetform );
END IF;
CALL DBMS_OUTPUT.PUT_LINE( 'col[i].col_null_ok = ' || col[i].col_null_ok );
CALL DBMS_OUTPUT.NEW_LINE();
SET i = i + 1;
END LOOP;
END IF;
END@
Output:
col_cnt = 4
i = 1
col[i].col_name = EMPNO
col[i].col_name_len = 5
col[i].col_schema_name = NULL
col[i].col_schema_name_len = NULL
col[i].col_type = 452
col[i].col_max_len = 6
col[i].col_precision = 6
col[i].col_scale = 0
col[i].col_charsetid = NULL
col[i].col_charsetform = NULL
col[i].col_null_ok = 0
i = 2
col[i].col_name = FIRSTNME
col[i].col_name_len = 8
col[i].col_schema_name = NULL
col[i].col_schema_name_len = NULL
col[i].col_type = 448
col[i].col_max_len = 12
col[i].col_precision = 12
col[i].col_scale = 0
col[i].col_charsetid = NULL
col[i].col_charsetform = NULL
col[i].col_null_ok = 0
i = 3
col[i].col_name = LASTNAME
col[i].col_name_len = 8
col[i].col_schema_name = NULL
col[i].col_schema_name_len = NULL
col[i].col_type = 448
col[i].col_max_len = 15
col[i].col_precision = 15
col[i].col_scale = 0
col[i].col_charsetid = NULL
col[i].col_charsetform = NULL
col[i].col_null_ok = 0
i = 4
col[i].col_name = SALARY
col[i].col_name_len = 6
col[i].col_schema_name = NULL
col[i].col_schema_name_len = NULL
col[i].col_type = 484
col[i].col_max_len = 5
col[i].col_precision = 9
col[i].col_scale = 2
col[i].col_charsetid = NULL
col[i].col_charsetform = NULL
col[i].col_null_ok = 1