Oracle识别数据类型

Ste*_*ven 8 oracle types

是否有Oracle函数返回参数的数据类型?

或者,确定我编写的查询中所有列的数据类型的最简单方法是什么?

bor*_*jab 14

转储功能:

返回包含数据类型代码,长度(以字节为单位)和expr内部表示形式的VARCHAR2值.返回的结果始终在数据库字符集中.有关每个代码对应的数据类型,请参见表2-1.


Jef*_*emp 5

如果您编写了查询,则可以基于该查询创建一个视图,然后查询数据字典以查看列的数据类型是什么:

create view vw_test as
select 1       an_integer,
       'abc'   a_string,
       sysdate a_date
from dual;

desc vw_test;

Name        Null     Type
----------- -------- ------------------
AN_INTEGER           NUMBER
A_STRING             CHAR(3)
A_DATE               DATE
Run Code Online (Sandbox Code Playgroud)

我猜想,但是,您需要某种通用的方式在运行时确定这一点。由于此方法涉及DDL,因此它不是很有用。在这种情况下,DBMS_SQL可以帮助您:

从DBMS_SQL文档中:

DECLARE
  c           NUMBER;
  d           NUMBER;
  col_cnt     INTEGER;
  f           BOOLEAN;
  rec_tab     DBMS_SQL.DESC_TAB;
  col_num    NUMBER;
  PROCEDURE print_rec(rec in DBMS_SQL.DESC_REC) IS
  BEGIN
    DBMS_OUTPUT.NEW_LINE;
    DBMS_OUTPUT.PUT_LINE('col_type            =    '
                         || rec.col_type);
    DBMS_OUTPUT.PUT_LINE('col_maxlen          =    '
                         || rec.col_max_len);
    DBMS_OUTPUT.PUT_LINE('col_name            =    '
                         || rec.col_name);
    DBMS_OUTPUT.PUT_LINE('col_name_len        =    '
                         || rec.col_name_len);
    DBMS_OUTPUT.PUT_LINE('col_schema_name     =    '
                         || rec.col_schema_name);
    DBMS_OUTPUT.PUT_LINE('col_schema_name_len =    '
                         || rec.col_schema_name_len);
    DBMS_OUTPUT.PUT_LINE('col_precision       =    '
                         || rec.col_precision);
    DBMS_OUTPUT.PUT_LINE('col_scale           =    '
                         || rec.col_scale);
    DBMS_OUTPUT.PUT('col_null_ok         =    ');
    IF (rec.col_null_ok) THEN
      DBMS_OUTPUT.PUT_LINE('true');
    ELSE
      DBMS_OUTPUT.PUT_LINE('false');
    END IF;
  END;
BEGIN
  c := DBMS_SQL.OPEN_CURSOR;

  DBMS_SQL.PARSE(c, 'SELECT * FROM scott.bonus', DBMS_SQL.NATIVE);

  d := DBMS_SQL.EXECUTE(c);

  DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab);

/*
 * Following loop could simply be for j in 1..col_cnt loop.
 * Here we are simply illustrating some of the PL/SQL table
 * features.
 */
  col_num := rec_tab.first;
  IF (col_num IS NOT NULL) THEN
    LOOP
      print_rec(rec_tab(col_num));
      col_num := rec_tab.next(col_num);
      EXIT WHEN (col_num IS NULL);
    END LOOP;
  END IF;

  DBMS_SQL.CLOSE_CURSOR(c);
END;
/
Run Code Online (Sandbox Code Playgroud)