如何在Oracle中获取CTE的列定义?
DESCRIBE DUAL
产生DUAL
的列定义。但是:
WITH MyTable AS (SELECT * FROM DUAL)
DESCRIBE MyTable;
出现错误:missing SELECT keyword
答案 0 :(得分:2)
代码错误说,with块后缺少选择子句。 describe命令显示的是TABLE的结构,而不是QUERY RESULT的结构。要使用describe,您应该首先“实现”您的输出。
create table tab1 as (
with q1 as (select * from tab)
select * from q1
);
describe tab1;
或者您可以使用dump()函数,但是我们应该为每列显式添加它。
select dump(col1), dump(col2)
from query;
此处的一些信息:
答案 1 :(得分:2)
您可以使用DBMS_SQL查找SQL语句的列名和类型(如Alex Yu所建议的那样)。
您不能仅使用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