获取Oracle SQL查询的元数据

时间:2017-11-26 05:35:24

标签: sql oracle plsql

oracle中有没有办法获取正在运行的SQL查询的元数据?如同我的查询是:

SELECT fname,
       lname,
       age,
       salary
FROM emp_tab ;

我想获取结果集中返回的每列的元数据(即:age = NUM​​BER,lname = VARCAR2(25)etc;),这是在DB中定义的。

2 个答案:

答案 0 :(得分:2)

一种方法是使用DBMS_SQL.DESCRIBE_COLUMNS

表:

CREATE TABLE emp_tab (fname VARCHAR2(25),
       lname VARCHAR2(25),
       age NUMBER,
       salary NUMBER
);

查询:

DECLARE
   cur PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
   cols DBMS_SQL.DESC_TAB;
   ncols PLS_INTEGER;
BEGIN
   DBMS_SQL.PARSE(cur, 'SELECT fname,lname, age,  salary FROM emp_tab'
                 , DBMS_SQL.NATIVE);
   DBMS_SQL.DESCRIBE_COLUMNS (cur, ncols, cols);
   FOR i IN 1 .. ncols   LOOP
      DBMS_OUTPUT.PUT_LINE ('Column name:'|| cols(i).col_name || ' Column type:' 
           || cols(i).col_type || ' Max column length:' || cols(i).col_max_len);
   END LOOP;
   DBMS_SQL.CLOSE_CURSOR (cur);
END;
/

输出:

Column name:FNAME Column type:1 Max column length:25
Column name:LNAME Column type:1 Max column length:25
Column name:AGE Column type:2 Max column length:22
Column name:SALARY Column type:2 Max column length:22

答案 1 :(得分:0)

SQL> column column_name format a35;
SQL> column data_type format a20;
SQL> column data_default format a15;
SQL> select column_name, data_type||decode(data_type,'NUMBER',nvl2(data_precision,'('||data_precision||nvl2(data_scale,','||data_scale,'')||')',''),'('|| data_length||')') data_type, data_default
       from user_tab_columns 
      where table_name = upper('&i_table_name'); -- EMP_TAB