¿Hay una función de Oracle para devolver el tipo de datos del parámetro?Oracle Identify Data Type
Alternativamente, ¿cuál es la forma más fácil de determinar el tipo de datos de todas las columnas en una consulta que he escrito?
¿Hay una función de Oracle para devolver el tipo de datos del parámetro?Oracle Identify Data Type
Alternativamente, ¿cuál es la forma más fácil de determinar el tipo de datos de todas las columnas en una consulta que he escrito?
El Dump Función:
devuelve un valor VARCHAR2 contiene el código de tipo de datos, longitud en bytes, y la representación interna de expr. El resultado devuelto siempre está en el conjunto de caracteres de la base de datos. Para el tipo de datos correspondiente a cada código, consulte la Tabla 2-1.
Si has escrito una consulta, se puede crear un punto de vista basado en él y luego consultar el diccionario de datos para ver qué tipos de datos de las columnas son:
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
supongo, sin embargo, desea algún tipo de forma genérica de determinar esto en tiempo de ejecución. Este método no sería muy útil ya que involucra a DDL. En cuyo caso DBMS_SQL puede ayudarle a:
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;
/
En realidad, solo quería confirmar las reglas implícitas de conversión de tipo en una consulta. Sin embargo, este enfoque probablemente sea útil a medida que madure el diseño de mi base de datos (y eventualmente la base de datos). – Steven
Y pensar ... Escribí un programa PL/SQL para volcar los resultados de una consulta en una tabla temporal, a continuación, lea la información de vuelta de USER_TABLE_COLUMNS. – GameFreak