sql >> データベース >  >> RDS >> Oracle

構造にアクセスして、refcursorの列リスト、データ型を取得するにはどうすればよいですか?

    参照カーソルをDBMS_SQLに変換できます DBMS_SQL.TO_CURSOR_NUMBERを使用したカーソル 働き。次に、カーソル番号を取得して、DBMS_SQLを介してカーソル番号を検査して操作できます。 。これには、以下の例に示すように、その列を記述できることが含まれます。

    DECLARE
      l_rc              SYS_REFCURSOR;
    
      l_cursor_number   INTEGER;
      l_col_cnt         INTEGER;
      l_desc_tab        DBMS_SQL.desc_tab;
      l_col_num         INTEGER;
    BEGIN
      OPEN l_rc FOR 'SELECT object_name, object_type, last_ddl_time FROM dba_objects where rownum <= 10';
    
      l_cursor_number   := DBMS_SQL.to_cursor_number (l_rc);
    
      DBMS_SQL.describe_columns (l_cursor_number, l_col_cnt, l_desc_tab);
    
      l_col_num         := l_desc_tab.FIRST;
    
      IF (l_col_num IS NOT NULL) THEN
        LOOP
          DBMS_OUTPUT.put_line ('Column #' || l_col_num);
          DBMS_OUTPUT.put_line ('...name: ' || l_desc_tab (l_col_num).col_name);
          DBMS_OUTPUT.put_line ('...type: ' || l_desc_tab (l_col_num).col_type);
          DBMS_OUTPUT.put_line ('...maxlen: ' || l_desc_tab (l_col_num).col_max_len);
          -- ... other fields available in l_desc_tab(l_col_num) too.
          l_col_num   := l_desc_tab.NEXT (l_col_num);
          EXIT WHEN (l_col_num IS NULL);
        END LOOP;
      END IF;
    
      DBMS_SQL.close_cursor (l_cursor_number);
    END;
    

    出力

    Column #1
    ...name: OBJECT_NAME
    ...type: 1
    ...maxlen: 128
    Column #2
    ...name: OBJECT_TYPE
    ...type: 1
    ...maxlen: 23
    Column #3
    ...name: LAST_DDL_TIME
    ...type: 12
    ...maxlen: 7
    


    1. PostgreSQL:パフォーマンスの違いを除いてNOT IN対(編集#2)

    2. MySQLのパフォーマンス:MySQLデータベースのインデックス作成を活用する方法

    3. 文字列内の文字と数字の数を見つける

    4. ORA-00997の回避策:LONGデータ型の不正使用