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 может помочь вам:
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;
/