oracle - 如何找出查询的字段类型
问题描述
我想知道我的查询字段的类型。
目前,脑海中只有一个选择——
create table table_name as select trunc (systimestamp) from dual;
然后我可以查看表列的数据类型,发现它是DATE类型。
有更优雅的解决方案吗?
也许有一些类似的 DESCRIBE - DESCRIBE (SELECT trunc (systimestamp) FROM dual)
; 或类似的东西
解决方案
这可以使用DBMS_SQL
包中提供的实用程序来实现。您不必创建表。使用您希望描述的任何查询作为此通用过程的参数。
程序
CREATE OR REPLACE PROCEDURE desc_query (p_query VARCHAR2) AS
v_static_rc SYS_REFCURSOR;
v_desc DBMS_SQL.DESC_TAB;
v_cols BINARY_INTEGER;
v_cursor BINARY_INTEGER;
v_datatype VARCHAR2(40) ;
BEGIN
OPEN v_static_rc FOR p_query;
v_cursor := DBMS_SQL.TO_CURSOR_NUMBER(v_static_rc);
DBMS_SQL.DESCRIBE_COLUMNS(v_cursor, v_cols, v_desc);
DBMS_SQL.CLOSE_CURSOR(v_cursor);
dbms_output.put_line(rpad('COL',3)
|| ' ' || RPAD('COLUMN_NAME',15) ||'DATA TYPE' );
FOR i IN 1 .. v_cols LOOP
DBMS_OUTPUT.PUT( rpad(i,3) || ' ' || RPAD(v_desc(i).col_name,15));
select
decode(v_desc(i).col_type, 1,
decode(v_desc(i).col_charsetform, 2, 'NVARCHAR2',
'VARCHAR2'),
2, decode(v_desc(i).col_scale, null,
decode(v_desc(i).col_precision, null,
'NUMBER', 'FLOAT'), 'NUMBER'),
8, 'LONG',
9, decode(v_desc(i).col_charsetform, 2, 'NCHAR VARYING', 'VARCHAR'),
12, 'DATE',
23, 'RAW', 24, 'LONG RAW',
69, 'ROWID',
96, decode(v_desc(i).col_charsetform, 2, 'NCHAR', 'CHAR'),
100, 'BINARY_FLOAT',
101, 'BINARY_DOUBLE',
105, 'MLSLABEL',
106, 'MLSLABEL',
111, 'REF',
112, decode(v_desc(i).col_charsetform, 2, 'NCLOB', 'CLOB'),
113, 'BLOB', 114, 'BFILE', 115, 'CFILE',
121, 'USER_TYPE',
122, 'USER_TYPE',
123, 'USER_TYPE',
178, 'TIME(' ||v_desc(i).col_scale|| ')',
179, 'TIME(' ||v_desc(i).col_scale|| ')' || ' WITH TIME ZONE',
180, 'TIMESTAMP(' ||v_desc(i).col_scale|| ')',
181, 'TIMESTAMP(' ||v_desc(i).col_scale|| ')'||' WITH TIME ZONE',
231, 'TIMESTAMP(' ||v_desc(i).col_scale|| ')'||' WITH LOCAL TIME ZONE',
182, 'INTERVAL YEAR(' ||v_desc(i).col_precision||') TO MONTH',
183, 'INTERVAL DAY(' ||v_desc(i).col_precision||') TO SECOND(' ||
v_desc(i).col_scale || ')',
208, 'UROWID',
'UNDEFINED') type_name into v_datatype from dual;
dbms_output.put_line(v_datatype);
END LOOP;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR OCCURED: '|| SQLERRM);
END;
/
现在,通过执行这样的过程(或使用EXEC
)来描述任何查询:
BEGIN
desc_query('SELECT 1 as id, CAST ( ''STR'' as VARCHAR2(10) ) as str ,
SYSTIMESTAMP as tstamp,trunc (SYSTIMESTAMP) as trunc_tstamp
from dual'
);
END;
/
结果
COL COLUMN_NAME DATA TYPE
1 ID NUMBER
2 STR VARCHAR2
3 TSTAMP TIMESTAMP(6) WITH TIME ZONE
4 TRUNC_TSTAMP DATE
推荐阅读
- java - 用于托管 jar 文件的 Azure Springboot (Java) 管道 CI/CD
- java - 带有双向文本/数字的android textview中的阿拉伯数字正在反转
- kotlin - 如何与 Moshi 同时解析时间戳和时区偏移量?
- python - 子查询的使用非常慢
- css - Material UI TextField 边框与 Label 重叠
- javascript - 每次更改 crom 标签时,Chrome 扩展 postMessage 从后台脚本到内容脚本
- html - Outlook HTML 中的表格宽度问题
- reactjs - 关于useEffect中的无限循环
- telegram - 邀请朋友来电报频道
- amazon-web-services - 使用 terraform 版本 0.12 的 AWS KMS 和 IAM 关联