Comunidad Oracle Hispana

Hola a Todos,

Grupo, como se puede saber si un dato es numerico, letras, alfanumerico o fecha???

Gracias de antemano

Ivan G.

Visitas: 764

Responde a esto

Respuestas a esta discusión

mmm ....podrias hacer uso de la tabla all_tab_column... ahi veras como esta construida la tabla deseada....


see ya
Si claro, pero lo que voy hacer es una importacion de datos a una tabla, y lo que necesito es saber si el dato que voy a importar es del tipo de dato que estoy esperando, los datos pueden venir de xls. cvs, txt, etc, estoy haciendo un trigger antes de insertar, para eso quiero validar el contenido del dato que voy a insertar, por eso veo necesario evaluar el dato en si. Gracias


bobymetal dice:
mmm ....podrias hacer uso de la tabla all_tab_column... ahi veras como esta construida la tabla deseada....


see ya
Se debe usar to_number(), to_date(), sin más. Eso ya esta implementado en Oracle, si el to_number te da error pues no es número, lo mismo con una fecha.
Tanto en la web de Tom Kyte como en un libro ( que ya no me acuerdo ), se muestran los horrores de inventar el agua tibia.

Si empiezas a hacer esta validación simple contra un dual o contra otra tabla haces una lectura consistente si lo metes dentro de un bucle pues tienes el clásico query que chupa CPU y nadie sabe porqué.

Slds FJA
Buenos días Ivan
El siguiente ejemplo te puede dar una idea de como puedes determinar si una columna es de un tipo de datos específico.
Puedes adaptarlo en un función y que te devuelva el resultado de la evaluación, para una columna específica.
Saludos
Te adjunto la fuente del ejemplo.
Yo lo probé y si funciona.

http://stackoverflow.com/questions/1087161/oracle-identify-data-type

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 t1', 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;
/

create view vw_test as
select 1 an_integer, 'abc' a_string, sysdate a_date from dual;
SQL> set linesize 80
SQL> desc rd_enlaces
Name Null? Type
----------------------------------------- -------- ----------------
CODIGO NOT NULL VARCHAR2(5)
ORDEN NOT NULL NUMBER(2)
DESCRIPCION NOT NULL VARCHAR2(30)
DB_LINK NOT NULL VARCHAR2(80)
IND_OFICINA NOT NULL VARCHAR2(1)
IND_ACTIVO NOT NULL VARCHAR2(1)

SQL> @0
col_type = 1
col_maxlen = 5
col_name = CODIGO
col_name_len = 6
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = 0
col_null_ok = false
col_type = 2
col_maxlen = 22
col_name = ORDEN
col_name_len = 5
col_schema_name =
col_schema_name_len = 0
col_precision = 2
col_scale = 0
col_null_ok = false
col_type = 1
col_maxlen = 30
col_name = DESCRIPCION
col_name_len = 11
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = 0
col_null_ok = false
col_type = 1
col_maxlen = 80
col_name = DB_LINK
col_name_len = 7
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = 0
col_null_ok = false
col_type = 1
col_maxlen = 1
col_name = IND_OFICINA
col_name_len = 11
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = 0
col_null_ok = false
col_type = 1
col_maxlen = 1
col_name = IND_ACTIVO
col_name_len = 10
col_schema_name =
col_schema_name_len = 0
col_precision = 0
col_scale = 0
col_null_ok = false

PL/SQL procedure successfully completed.

SQL> select * from vw_test;

AN_INTEGER A_S A_DATE
---------- --- ---------
1 abc 29-JUL-09


Ronald Fco. Vargas Quesada dice:
Buenos días Ivan
El siguiente ejemplo te puede dar una idea de como puedes determinar si una columna es de un tipo de datos específico.
Puedes adaptarlo en un función y que te devuelva el resultado de la evaluación, para una columna específica.
Saludos
Te adjunto la fuente del ejemplo.
Yo lo probé y si funciona.

http://stackoverflow.com/questions/1087161/oracle-identify-data-type

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 t1', 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;
/

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

Responder a debate

RSS

Siguenos en Twitter

Escucha nuestro podcast!

Eventos

Insignia

Cargando…

© 2012   Creado por Fernando Garcia.

Insignias  |  Informar un problema  |  Términos de servicio