DESCRIBE_COLUMNS プロシージャー - SELECT リストに含まれる列の記述の取得

DESCRIBE_COLUMNS プロシージャーは、カーソルから SELECT リストに含まれる列の記述を取得する機能を提供します。

構文

構文図を読む構文図をスキップするDBMS_SQL.DESCRIBE_COLUMNS( c,col_cnt,desc_tab )

パラメーター

c
列が記述されるカーソルのカーソル ID を指定する、タイプ INTEGER の入力引数。
col_cnt
カーソルの SELECT リスト内の列の数を戻す、タイプ INTEGER の出力引数。
desc_tab
列のメタデータを記述する、タイプ DESC_TAB の出力引数。 DESC_TAB 配列は、指定されたカーソルの各列の情報を提供します。

許可

DBMS_SQL モジュールに対する EXECUTE 特権。

使用上の注意

このプロシージャーは、ページ・サイズが 4K の USER TEMPORARY 表スペースを必要とします。この要件が満たされない場合は SQL0286N エラーを戻します。 USER TEMPORARY 表スペースは、次のコマンドで作成できます。
CREATE USER TEMPORARY TABLESPACE DBMS_SQL_TEMP_TBS
DESC_TAB は、列情報の入った DESC_REC レコードの配列です。
表 1. DESC_REC レコードによる DESC_TAB の定義
レコード名 説明
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 データ・タイプを示す場合、この変数は列が保持できる 2 バイト文字の最大数を表します。
col_scale データベースで定義されている列の位取り (DECIMAL、NUMERIC、TIMESTAMP にのみ適用)。
col_charsetid 常に NULL。
col_charsetform 常に NULL。
col_null_ok NULL 可能標識。 列が NULL 可能の場合は値が 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」表の empnoenamehiredate、および 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@

出力:
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