您可以使用DBMS_SQL解析查詢並獲取列名,數據類型和長度/刻度。
declare
PROCEDURE temp (p_query IN VARCHAR2) IS
col_cnt INTEGER;
rec_tab dbms_sql.desc_tab2;
v_tab dbms_sql.varchar2s;
v_cursor NUMBER;
v_line varchar2(100);
v_datatype varchar2(100);
BEGIN
v_cursor := dbms_sql.open_cursor;
dbms_sql.parse(v_cursor, p_query, 1);
dbms_sql.describe_columns2(v_cursor, col_cnt, rec_tab);
dbms_sql.close_cursor(v_cursor);
FOR v_pos in 1..rec_tab.LAST LOOP
v_datatype :=
case rec_tab(v_pos).col_type
when 1 THEN 'VARCHAR2'
when 2 THEN 'NUMBER'
when 8 THEN 'LONG'
when 9 THEN 'VARCHAR'
when 12 THEN 'DATE'
when 23 THEN 'RAW'
when 24 THEN 'LONG RAW'
when 69 THEN 'ROWID'
when 96 THEN 'CHAR'
when 100 THEN 'BINARY_FLOAT'
when 101 THEN 'BINARY_DOUBLE'
when 112 THEN 'CLOB'
when 113 THEN 'BLOB'
when 114 THEN 'BFILE'
when 115 THEN 'CFILE'
when 178 THEN 'TIME'
when 179 THEN 'TIME WITH TIME ZONE'
when 180 THEN 'TIMESTAMP'
when 181 THEN 'TIMESTAMP WITH TIME ZONE'
when 231 THEN 'TIMESTAMP WITH LOCAL TIME ZONE'
when 182 THEN 'INTERVAL YEAR TO MONTH'
when 183 THEN 'INTERVAL DAY TO SECOND'
when 208 THEN 'UROWID'
else 'OTHER:'||rec_tab(v_pos).col_type
end;
if rec_tab(v_pos).col_precision > 0 and rec_tab(v_pos).col_scale > 0 then
v_datatype := v_datatype||'('||rec_tab(v_pos).col_precision||','||rec_tab(v_pos).col_scale||')';
elsif rec_tab(v_pos).col_precision > 0 and v_datatype != 'NUMBER' then
v_datatype := v_datatype||'('||rec_tab(v_pos).col_precision||')';
elsif rec_tab(v_pos).col_max_len > 0 and v_datatype != 'NUMBER' then
v_datatype := v_datatype||'('||rec_tab(v_pos).col_max_len||')';
else
v_datatype := v_datatype;
end if;
v_line := rpad(rec_tab(v_pos).col_name,32)||
rpad(v_datatype,32);
dbms_output.put_line(v_line);
END LOOP;
END;
BEGIN
temp(q'{select 'This is a string. ' || 2020 || ' Another string' TEMP_COL from dual }');
END;
/
咦?如果沒有視圖,則沒有「計算值」。 – OldProgrammer
'select length('This is a string。'|| 2020 ||'another string')from dual'?或者,如果您需要其他數據類型,可能是'dump()'。你究竟想要做什麼? –
可能是'DUMP()'? https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions048.htm#i77278 – mustaccio