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

Oracle 如何使用光标检查列类型?,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我需要查询Oracle数据库表并检查列的数据类型。 我得到了下面的脚本,但类型_名称无法识别。我可以检查列的内容,但我需要检查表的实际类型 有人知道我怎么做吗 set pagesize 1000; variable errorCode number; DECLARE cursor c1 is select theColumn from myDatabaseTable; colRec c1%ROWTYPE; BEGIN :errorCode := 0;

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

有人知道我怎么做吗

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;
设置页面大小1000;
可变错误代码;
声明
光标c1为
从myDatabaseTable中选择列;
colRec c1%行类型;
开始
:错误代码:=0;
开c1;
将c1取出到colRec中;
如果colRec.TYPE_NAME'CHAR',则
:错误代码:=1;
如果结束;
关闭c1;
结束;
/
退出:错误代码;

您可以按表名和列名检入其中一个数据字典视图:dba\u tab\u cols、all\u tab\u cols或user\u tab\u cols

比如说,

select data_type
from dba_tab_cols
where table_name = 'MYTABLE'
and column_name = 'MYCOL'
如果使用dba\u tab\u cols或all\u tab\u cols视图,则还需要在查询中包含所有者:

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

您可以按表名和列名签入其中一个数据字典视图:dba\u tab\u cols、all\u tab\u cols或user\u tab\u cols

比如说,

select data_type
from dba_tab_cols
where table_name = 'MYTABLE'
and column_name = 'MYCOL'
如果使用dba\u tab\u cols或all\u tab\u cols视图,则还需要在查询中包含所有者:

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

您可以使用过程
DBMS\u SQL。通过将查询解析为
游标来描述列。该过程为您提供了一个包含列、数据类型和大小的集合

col_type - gives you the datatypes.
col_name - gives you the column_names.
.. and so on.
有关详细信息,请参阅此链接

这里有一个例子

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 
因此,您可以进行如下比较:

如果记录(i).col\u类型96,则

或者编写一个case块,例如


CASE WHEN rec_t(i).col_type=96,然后“CHAR”
并比较CASE块的输出。

您可以使用过程
DBMS\u SQL。通过将查询解析为
游标来描述列。该过程为您提供了一个包含列、数据类型和大小的集合

col_type - gives you the datatypes.
col_name - gives you the column_names.
.. and so on.
有关详细信息,请参阅此链接

这里有一个例子

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 
因此,您可以进行如下比较:

如果记录(i).col\u类型96,则

或者编写一个case块,例如

当rec_t(i).col_type=96时为CASE,然后为'CHAR'
并比较CASE块的输出