Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Problemas con ejecución de funcion en Oracle

Estas en el tema de Problemas con ejecución de funcion en Oracle en el foro de Oracle en Foros del Web. Hola Amigos de FDW, tengo creada esta función (no estoy seguro si en realidad funciona, soy novato con oracle) @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original ...
  #1 (permalink)  
Antiguo 16/04/2013, 07:26
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 7 meses
Puntos: 19
Problemas con ejecución de funcion en Oracle

Hola Amigos de FDW, tengo creada esta función (no estoy seguro si en realidad funciona, soy novato con oracle)
Código SQL:
Ver original
  1. CREATE OR REPLACE TYPE T_Record IS OBJECT
  2. (
  3. Account_ID NUMERIC,
  4. DATEACCT TIMESTAMP,
  5. AMTSourceDR NUMERIC,
  6. AMTSourceCR NUMERIC,
  7. AMTSourceN NUMERIC
  8. );
  9.  
  10. CREATE OR REPLACE TYPE T_RecordNode IS OBJECT
  11. (
  12. nodeid NUMERIC
  13. );
  14.  
  15. CREATE OR REPLACE TYPE T_RecordEV IS OBJECT
  16. (
  17. elementvalue NUMERIC,
  18. reportline NUMERIC
  19. );
  20.  
  21. -- Creado el Tipo de Objeto
  22.  
  23. DROP TYPE T_TableRecordNode
  24.  
  25. CREATE OR REPLACE TYPE T_TableRecord AS TABLE OF T_Record;
  26. CREATE OR REPLACE TYPE T_TableRecordEV AS TABLE OF T_RecordEV;
  27. CREATE OR REPLACE TYPE T_TableRecordNode AS TABLE OF T_RecordNode;
  28.  
  29. -- Creado el Tipo de Tabla
  30.  
  31. CREATE OR REPLACE FUNCTION FN_TableRecord(valor1 IN NUMERIC, valor2 IN NUMERIC)
  32. RETURN T_TableRecord
  33. AS
  34. rs T_TableRecord;
  35. recor T_TableRecordNode;
  36. rsl T_TableRecordEV;
  37. sumary CHAR(1);
  38. BEGIN
  39. RAISE 'entro';
  40. IF $1 IS NULL THEN
  41.     FOR
  42.     SELECT rsl IN SELECT rsu.c_elementvalue_id, rsu.pa_reportline_id FROM c_elementvalue ev INNER JOIN pa_reportsource rsu ON ev.c_elementvalue_id = rsu.c_elementvalue_id WHERE ev.ad_client_id = $2
  43.         LOOP
  44.             FOR rs IN SELECT rsl.pa_reportline_id, rsl.c_elementvalue_id,DATEACCT, AmtSourceDR, AmtSourceCR, AmtSourceN FROM TABLE(FN_TableRecord(rsl.c_elementvalue_id,$2))
  45.             LOOP
  46.                 RETURN rs;
  47.             END LOOP;
  48.         END LOOP;
  49. ELSE
  50.     sumary := (SELECT issummary FROM c_elementvalue WHERE c_elementvalue_id = $1);
  51.     IF sumary = 'Y' THEN
  52.         FOR recor IN SELECT node_id FROM ad_treenode tn INNER JOIN ad_tree t ON tn.ad_tree_id = t.ad_tree_id WHERE parent_id = $1 AND t.treetype = 'EV'
  53.             LOOP
  54.                 FOR rs IN SELECT * FROM TABLE(FN_TableRecord(recor.node_id,$2))
  55.                 LOOP
  56.                     RETURN rs;
  57.                 END LOOP;
  58.             END LOOP;
  59.     ELSE
  60.         FOR rs IN SELECT Account_ID, DATEACCT, SUM(AmtSourceDR) AS AmtSourceDR,SUM(AmtSourceCR) AS AmtSourceCR,SUM(AmtSourceDR-AmtSourceCR) AS AmtSourceN FROM FACT_ACCT WHERE Account_ID = $1 GROUP BY Account_ID,DATEACCT
  61.         LOOP
  62.             RETURN rs;
  63.         END LOOP;
  64.     END IF;
  65. END IF;
  66. END;
  67. LANGUAGE 'PL/SQL';
Pero cuando la voy a ejecutar
Código SQL:
Ver original
  1. SELECT * FROM TABLE(FN_TableRecord(NULL,1000000))
Me genera este error:
ORA-06575: La función o el paquete FN_TABLERECORD tienen en un estado no válido
Línea de script 69, línea de instrucción 1, columna 20


Espero me puedan ayudar, Gracias.

Última edición por gnzsoloyo; 16/04/2013 a las 12:42 Razón: SQL mal etiquetado
  #2 (permalink)  
Antiguo 16/04/2013, 10:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Problemas con ejecución de funcion en Oracle

Cita:
ORA-06575: La función o el paquete FN_TABLERECORD tienen en un estado no válido
La función se compiló, pero con errores.

Revisa que errores tiene la función al comilarla nuevamente.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 16/04/2013, 10:10
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 7 meses
Puntos: 19
Respuesta: Problemas con ejecución de funcion en Oracle

Gracias por tu respuesta, pero como muestro los errores xq leí por allí que era con el Show Errors pero no funcionó o no supe como implementarlo.

por eso dije no se si la función que creé esta bien.
  #4 (permalink)  
Antiguo 16/04/2013, 10:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problemas con ejecución de funcion en Oracle

Cita:
por eso dije no se si la función que creé esta bien.
No se creó bien. Precisamente por eso te da error.
Oracle no funciona como otros DBMSs, donde si una rutina almacenada (SP o SF), no compila bien, no se crea. En Oracle se crea, pero no es válida.
En otras palabras: Existe, pero no funciona.

Revisa la función creada y verifica qué errores contiene. cuando los hayas resuelto, vuelve a compilarla.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 16/04/2013, 10:55
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 7 meses
Puntos: 19
Respuesta: Problemas con ejecución de funcion en Oracle

Allí quisiera me ayudaran un poco, porque a mi parecer no le veo algún error (se que existe porque no funciona), pero como mencione anteriormente soy nuevo con oracle y hay ciertas cosas que son muy distintas para mi que en otros DBMSs.

Espero me puedan echar una manito.. igual sigo investigando a ver que consigo hacer. Gracias.
  #6 (permalink)  
Antiguo 16/04/2013, 12:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problemas con ejecución de funcion en Oracle

Normalmente algunas interfases como el SQL Developer, al mostrarte el código fuente, si es inválido, también te muestran un mensaje explicativo de cuál es el error que se encuentra, y hasta te pueden posicionar el cursor en la primera aparición de el o los errores encontrados.
¿Con qué lo estás editando?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 16/04/2013, 12:31
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 7 meses
Puntos: 19
Respuesta: Problemas con ejecución de funcion en Oracle

Actualmente estoy trabajando con AquaFold Datastudio, el cual me permite trabajar con cualquier DBMSs solo definiendo la conexión al servidor que tiene alojada la BD y ps con ese programa no me muestra un msj explicativo, solo me dice que existe una advertencia. pero como dije anteriormente intente ejecutar el show errors y no me funcionó
  #8 (permalink)  
Antiguo 16/04/2013, 12:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problemas con ejecución de funcion en Oracle

¿Qué versión de Oracle usas?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 16/04/2013, 12:54
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 7 meses
Puntos: 19
Respuesta: Problemas con ejecución de funcion en Oracle

Es la versión 10g.
  #10 (permalink)  
Antiguo 16/04/2013, 12:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problemas con ejecución de funcion en Oracle

OK.
Preguntaba, porque hay algunas cosas de la sintaxis que no reconozco (usualmente trabajo con la 8i o la 11g), o al menos nunca he visto usar.
Cuando llegue a casa probaré lo que pusiste.
Por lo pronto, el primer DROP TYPE no tiene cierre de sentencia.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 16/04/2013, 13:01
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 7 meses
Puntos: 19
Respuesta: Problemas con ejecución de funcion en Oracle

Ok perdón dejame limpiar algo ese codigo, ese drop esta allí xq habia definido mal el tipo objeto T_RecordNode pero no lo podia modificar ya que estaba asociado al tipo de tabla T_TableRecordNode
  #12 (permalink)  
Antiguo 16/04/2013, 13:06
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 7 meses
Puntos: 19
Respuesta: Problemas con ejecución de funcion en Oracle

Cita:
Iniciado por jlct Ver Mensaje
Código SQL:
Ver original
  1. CREATE OR REPLACE TYPE T_Record IS OBJECT
  2. (
  3. Account_ID NUMERIC,
  4. DATEACCT TIMESTAMP,
  5. AMTSourceDR NUMERIC,
  6. AMTSourceCR NUMERIC,
  7. AMTSourceN NUMERIC
  8. );
  9.  
  10. CREATE OR REPLACE TYPE T_RecordNode IS OBJECT
  11. (
  12. nodeid NUMERIC
  13. );
  14.  
  15. CREATE OR REPLACE TYPE T_RecordEV IS OBJECT
  16. (
  17. elementvalue NUMERIC,
  18. reportline NUMERIC
  19. );
  20.  
  21. -- Creado el Tipo de Objeto
  22.  
  23. CREATE OR REPLACE TYPE T_TableRecord AS TABLE OF T_Record;
  24. CREATE OR REPLACE TYPE T_TableRecordEV AS TABLE OF T_RecordEV;
  25. CREATE OR REPLACE TYPE T_TableRecordNode AS TABLE OF T_RecordNode;
  26.  
  27. -- Creado el Tipo de Tabla
  28.  
  29. CREATE OR REPLACE FUNCTION FN_TableRecord(valor1 IN NUMERIC, valor2 IN NUMERIC)
  30. RETURN T_TableRecord
  31. AS
  32. rs T_TableRecord;
  33. recor T_TableRecordNode;
  34. rsl T_TableRecordEV;
  35. sumary CHAR(1);
  36. BEGIN
  37. IF $1 IS NULL THEN
  38.     FOR
  39.     SELECT rsl IN SELECT rsu.c_elementvalue_id, rsu.pa_reportline_id FROM c_elementvalue ev INNER JOIN pa_reportsource rsu ON ev.c_elementvalue_id = rsu.c_elementvalue_id WHERE ev.ad_client_id = $2
  40.         LOOP
  41.             FOR rs IN SELECT rsl.pa_reportline_id, rsl.c_elementvalue_id,DATEACCT, AmtSourceDR, AmtSourceCR, AmtSourceN FROM TABLE(FN_TableRecord(rsl.c_elementvalue_id,$2))
  42.             LOOP
  43.                 RETURN rs;
  44.             END LOOP;
  45.         END LOOP;
  46. ELSE
  47.     sumary := (SELECT issummary FROM c_elementvalue WHERE c_elementvalue_id = $1);
  48.     IF sumary = 'Y' THEN
  49.         FOR recor IN SELECT node_id FROM ad_treenode tn INNER JOIN ad_tree t ON tn.ad_tree_id = t.ad_tree_id WHERE parent_id = $1 AND t.treetype = 'EV'
  50.             LOOP
  51.                 FOR rs IN SELECT * FROM TABLE(FN_TableRecord(recor.node_id,$2))
  52.                 LOOP
  53.                     RETURN rs;
  54.                 END LOOP;
  55.             END LOOP;
  56.     ELSE
  57.         FOR rs IN SELECT Account_ID, DATEACCT, SUM(AmtSourceDR) AS AmtSourceDR,SUM(AmtSourceCR) AS AmtSourceCR,SUM(AmtSourceDR-AmtSourceCR) AS AmtSourceN FROM FACT_ACCT WHERE Account_ID = $1 GROUP BY Account_ID,DATEACCT
  58.         LOOP
  59.             RETURN rs;
  60.         END LOOP;
  61.     END IF;
  62. END IF;
  63. END;
  64. LANGUAGE 'PL/SQL';
Así es como lo tengo actualmente, el raise era solo para comprobar si entraba o no en la función, pero ya me explicaste que quedo mal compilada y por ende no funciona.
  #13 (permalink)  
Antiguo 16/04/2013, 20:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problemas con ejecución de funcion en Oracle

Hay un par de cosas que no me terminan de cerrar (aún considerando que llevo sólo un año y medio en Oracle):
1) Las llamadas de tipo $1 y $2, son más propias de la ejecución de scripts Oracle por bash (consola), que de un stored procedure. Al menos en ninguno de los SP que están en la base de nuestra empresa existen parámetros usados así...
2) Pareciera que pretendieras usar cursores, pero no están declarados. Y el uso de cosas como "SELECT rsl IN SELECT rsu.c_elementvalue_id...", o "FOR rs IN SELECT Account_ID, DATEACCT..." simplemente no las encuentro ni en los manuales.
¿Estás seguro de no estar usando sintaxis de PostgreSQL o Firebird?

Lo que sí he encontrado documentado como para Oracle 11g, es una forma como esta:
Código SQL:
Ver original
  1. FOR i IN ( SELECT prim_key j FROM data_table )
  2. loop
  3.    SELECT 'Very long descrip of prim_key:', prim_key
  4.       FROM data_table WHERE prim_key = i.j ;
  5.    SELECT 'Very long descrip of field 1:', field1
  6.       FROM data_table WHERE prim_key = i.j ;
  7.    SELECT 'Very long descrip of field 2:', field2
  8.       FROM data_table WHERE prim_key = i.j ;
  9. END loop
Donde, puedes ver, la subconsulta de origen está encerrada entre paréntesis. Aunque, claro, no es un modo muy ortodoxo de hacerlo. Hay algunas otras formas mucho más eficientes.

Fuera de eso, insisto, da la impresión de que estás trayendo sintaxis de un DBMS a otro, y no existe un PL/SQL estándar...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 16/04/2013, 20:48
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Problemas con ejecución de funcion en Oracle

Totalmente deacuerdo.
$1,$2 etc son notaciones de postgresql para referirse en orden a los parametros de entrada de una función.

Por otro lado, IS OBJECT si es de oracle y no de postgresql.

Sospecho que estas afrondando una migración de motores y todavia existen secuelas de esto.

El codigo que pones, requiere de muchas correcciones para que compile sin errores.

Por otro lado, si estas teniendo problemas para ver los errores, abre una consola de sqlplus y pega tu codigo. En esta consola SHOW ERRORS si funciona y sabras cada uno de los errores.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #15 (permalink)  
Antiguo 17/04/2013, 06:49
Avatar de jlct  
Fecha de Ingreso: abril-2012
Ubicación: Venezuela
Mensajes: 148
Antigüedad: 12 años, 7 meses
Puntos: 19
Respuesta: Problemas con ejecución de funcion en Oracle

Hola Gracias por sus respuestas, en efecto estoy tratando de migrar una función realizada en postgresql a oracle, como hice mención anteriormente soy novato en esto.

lo que quiero implementar es que las consultas se recorran como si fuera un record. y la manera como indagando por internet conseguí fue esa, definir un tipo de objeto, luego definir una tabla del tipo de objeto que se definió previamente y retornar ese tipo de tabla.

he indagado en varias paginas sin poder encontrar una manera lo más apegada a como esta estructurado la función pero no ha sido posible.

Etiquetas: funcion, record
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:12.