如何使用光标检查列类型?

时间:2017-12-01 16:31:49

标签: oracle plsql oracle11g

我需要查询Oracle数据库表并检查列的数据类型。 我得到了以下脚本,但TYPE_NAME无法识别。我可以检查列的内容,但我需要检查表的实际类型。

任何人都知道如何做到这一点?

set pagesize 1000;
variable errorCode number;

DECLARE
    cursor c1 is
        select theColumn from myDatabaseTable;
    colRec c1%ROWTYPE;
BEGIN
    :errorCode := 0;
    OPEN c1;

    FETCH c1 INTO colRec;
    IF colRec.TYPE_NAME <> 'CHAR' THEN
        :errorCode := 1;
    END IF;


    CLOSE c1;
END;
/
exit :errorCode;

2 个答案:

答案 0 :(得分:1)

您可以通过table_name和column_name签入其中一个数据字典视图:dba_tab_cols,all_tab_cols或user_tab_cols。

例如,

select data_type
from dba_tab_cols
where table_name = 'MYTABLE'
and column_name = 'MYCOL'

如果您使用dba_tab_cols或all_tab_cols视图,您还希望在查询中包含所有者:

select data_type
from dba_tab_cols
where owner = 'SCHEMA' 
and table_name = 'MYTABLE'
and column_name = 'MYCOL'

答案 1 :(得分:1)

您可以通过将查询解析为DBMS_SQL.describe_columns来使用过程CURSOR。该过程为您提供了包含列,数据类型和大小的集合。

col_type - gives you the datatypes.
col_name - gives you the column_names.
.. and so on.

有关详细信息,请参阅此链接。

DBMS_SQL.DESCRIBE_COLUMNS

这是一个例子。

declare
    cur number;
    cnt number;
    rec_t dbms_sql.desc_tab;
begin
    cur := dbms_sql.open_cursor;

    dbms_sql.parse(cur, 'select 1 id, ''Stefan'' Name from DUAL', dbms_sql.native); 

    dbms_sql.describe_columns(cur, cnt, rec_t );

     FOR i IN 1..rec_t.COUNT
     LOOP
        dbms_output.put_line(rec_t(i).col_name || ' - TYPE ' || rec_t(i).col_type);
    END LOOP;

    dbms_sql.close_cursor(cur);
end;
/

类型是表示特定数据类型的数字。以下是提供重要数据类型的数字的列表。

Datatype       Number

VARCHAR2        1   
NVARCHAR2       1   
NUMBER          2   
INTEGER         2   
DATE            12  
CHAR            96  
NCHAR           96  
CLOB            112 
NCLOB           112 
BLOB            113 
BFILE           114 

所以,您可以进行比较,例如

IF rec_t(i).col_type <> 96 THEN ...

或写一个案例块,如

CASE WHEN rec_t(i).col_type = 96 THEN 'CHAR'并对案例块的输出进行比较。