DESCRIBE_COLUMNS procedure - Retrieve a description of the columns in a SELECT list
The DESCRIBE_COLUMNS procedure provides the capability to retrieve a description of the columns in a SELECT list from a cursor.
Syntax
Parameters
- c
- An input argument of type INTEGER that specifies the cursor ID of the cursor whose columns are to be described.
- col_cnt
- An output argument of type INTEGER that returns the number of columns in the SELECT list of the cursor.
- desc_tab
- An output argument of type DESC_TAB that describes the column metadata. The DESC_TAB array provides information on each column in the specified cursor.
Authorization
EXECUTE privilege on the DBMS_SQL module.
Usage notes
This procedure requires a user
temporary table space with a page size of 4K; otherwise it returns
an SQL0286N error. You can create the user temporary table space
with this command:
CREATE USER TEMPORARY TABLESPACE DBMS_SQL_TEMP_TBS
DESC_TAB is an array of DESC_REC records of column
information:
Record name | Description |
---|---|
col_type | SQL data type as defined in Supported SQL data types in C and C++ embedded SQL applications. |
col_max_len | Maximum length of the column. |
col_name | Column name. |
col_name_len | Length of the column name. |
col_schema | Always NULL. |
col_schema_name_len | Always NULL. |
col_precision | Precision of the column as defined in the database. If col_type denotes a graphic or DBCLOB SQL data type, then this variable indicates the maximum number of double-byte characters the column can hold. |
col_scale | Scale of the column as defined in the database (only applies to DECIMAL, NUMERIC, TIMESTAMP). |
col_charsetid | Always NULL. |
col_charsetform | Always NULL. |
col_null_ok | Nullable indicator. This has a value of 1 if the column is nullable, otherwise, 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];
Examples
Example 1: The following
example describes the
empno
, ename
, hiredate
,
and sal
columns from the "EMP" table. 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