Oracle Определяет Тип Данных

есть ли функция Oracle для возврата типа данных параметра?

кроме того, каков самый простой способ определить тип данных всех столбцов в запросе, который я написал?

2 ответов


на Dump функция:

возвращает значение VARCHAR2, содержащее код типа данных, длина в байтах и внутреннее представление expr. Возвращаемый результат всегда находится в наборе символов базы данных. Тип данных, соответствующий каждому коду, см. В таблице 2-1.


Если вы написали запрос, вы можете создать представление на его основе, а затем запросить словарь данных, чтобы узнать, какие типы данных столбцов:

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

Я предполагаю, однако, что вам нужен какой-то общий способ определения этого во время выполнения. Этот метод не был бы очень полезен, поскольку он включает 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;
/