Есть ли функция Oracle для возврата типа данных параметра?Oracle Identify Data Type
В качестве альтернативы, какой самый простой способ определить тип данных всех столбцов в запросе, который я написал?
Есть ли функция Oracle для возврата типа данных параметра?Oracle Identify Data Type
В качестве альтернативы, какой самый простой способ определить тип данных всех столбцов в запросе, который я написал?
Dump Функция:
возвращает значение VARCHAR2, содержащий код типа данных, длина в байтах, а внутреннее представление выраж. Возвращаемый результат всегда находится в наборе символов базы данных. Для типа данных, соответствующего каждому коду, см. Таблицу 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;
/
На самом деле, я просто хотел подтвердить неявные правила преобразования типов в запросе. Однако этот подход, скорее всего, будет полезен, поскольку мой проект базы данных (и, в конечном итоге, база данных) созревает. – Steven
И думать ... Я написал программу PL/SQL, чтобы сбросить результаты запроса во временную таблицу, а затем прочитать информацию обратно из USER_TABLE_COLUMNS. – GameFreak