Определения столбцов CTE - PullRequest
0 голосов
/ 02 марта 2019

Как получить определения столбцов CTE в Oracle?

DESCRIBE DUAL дает определение столбца DUAL.Но:

WITH MyTable AS (SELECT * FROM DUAL)
DESCRIBE MyTable;

выдает ошибку: missing SELECT keyword

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Вы можете найти имена столбцов и типы операторов SQL, используя DBMS_SQL (как предложил Алекс Ю).

Вы не можете только использовать CTE.Чтобы сделать оператор SQL действительным, вы должны выбрать из этого CTE, но это тривиальное изменение.

declare
    v_sql           varchar2(4000) := 'WITH MyTable AS (SELECT * FROM DUAL) select * from mytable';
    v_cursor_number integer;
    v_column_count  number;
    v_columns       dbms_sql.desc_tab3;
begin
    --Parse statement, get columns.
    v_cursor_number := dbms_sql.open_cursor;
    dbms_sql.parse(v_cursor_number, v_sql, dbms_sql.native);
    dbms_sql.describe_columns3(v_cursor_number, v_column_count, v_columns);

    --Print metadata.
    dbms_output.put_line('Column Name,Column Type');
    for i in 1 .. v_column_count loop
        dbms_output.put_line(v_columns(i).col_name || ',' ||
            --Thanks to APC for providing this list in
            --https://stackoverflow.com/a/12041206/409172:
            case v_columns(i).col_type
                when dbms_types.TYPECODE_DATE then 'DATE'             
                when dbms_types.TYPECODE_NUMBER then 'NUMBER'           
                when dbms_types.TYPECODE_RAW then 'RAW'              
                when dbms_types.TYPECODE_CHAR then 'CHAR'             
                when dbms_types.TYPECODE_VARCHAR2 then 'VARCHAR2'         
                when dbms_types.TYPECODE_VARCHAR then 'VARCHAR'          
                when dbms_types.TYPECODE_MLSLABEL then 'MLSLABEL'         
                when dbms_types.TYPECODE_BLOB then 'BLOB'             
                when dbms_types.TYPECODE_BFILE then 'BFILE'            
                when dbms_types.TYPECODE_CLOB then 'CLOB'              
                when dbms_types.TYPECODE_CFILE then 'CFILE'            
                when dbms_types.TYPECODE_TIMESTAMP then 'TIMESTAMP'        
                when dbms_types.TYPECODE_TIMESTAMP_TZ then 'TIMESTAMP_TZ'     
                when dbms_types.TYPECODE_TIMESTAMP_LTZ then 'TIMESTAMP_LTZ'    
                when dbms_types.TYPECODE_INTERVAL_YM then 'INTERVAL_YM'      
                when dbms_types.TYPECODE_INTERVAL_DS then 'INTERVAL_DS'      
                when dbms_types.TYPECODE_REF then 'REF'              
                when dbms_types.TYPECODE_OBJECT then 'OBJECT'           
                when dbms_types.TYPECODE_VARRAY then 'VARRAY'                       
                when dbms_types.TYPECODE_TABLE then 'TABLE'                        
                when dbms_types.TYPECODE_NAMEDCOLLECTION then 'NAMEDCOLLECTION'  
                when dbms_types.TYPECODE_OPAQUE then 'OPAQUE'                            
                when dbms_types.TYPECODE_NCHAR then 'NCHAR'            
                when dbms_types.TYPECODE_NVARCHAR2 then 'NVARCHAR2'       
                when dbms_types.TYPECODE_NCLOB then 'NCLOB'                  
                when dbms_types.TYPECODE_BFLOAT then 'BFLOAT'           
                when dbms_types.TYPECODE_BDOUBLE then 'BDOUBLE'          
                when dbms_types.TYPECODE_UROWID then 'UROWID'              
            end
        );
    end loop;

    --Close the cursor.
    dbms_sql.close_cursor(v_cursor_number);
end;
/

Результаты:

Column Name,Column Type
DUMMY,VARCHAR
0 голосов
/ 02 марта 2019

ошибка кода говорит о том, что после блока with отсутствует предложение select.Команда Описание показывает структуру ТАБЛИЦЫ, а не структуру QUERY RESULT.Чтобы использовать description, вы должны сначала «материализовать» свой вывод.

create table tab1 as (
  with q1 as (select * from tab)
  select * from q1
);
describe tab1;

Или вы можете использовать функцию dump (), но мы должны явно добавить ее для каждого столбца.

select dump(col1), dump(col2)
from query;

Некоторыеинформация здесь:

Получить тип данных поля в операторе выбора в ORACLE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...