我需要查询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;
答案 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.
有关详细信息,请参阅此链接。
这是一个例子。
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'
并对案例块的输出进行比较。