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

Ejecutar procedimiento almacenado con Cursor

Estas en el tema de Ejecutar procedimiento almacenado con Cursor en el foro de Oracle en Foros del Web. Buenas! Antes que nada, soy neofito en Oracle, así es que, si mi pregunta es muy básica, pido disculpas de antemano. Debo hacer un procedimiento ...
  #1 (permalink)  
Antiguo 18/12/2013, 11:05
Avatar de pcarvajal  
Fecha de Ingreso: enero-2002
Mensajes: 701
Antigüedad: 22 años, 10 meses
Puntos: 8
Pregunta Ejecutar procedimiento almacenado con Cursor

Buenas!
Antes que nada, soy neofito en Oracle, así es que, si mi pregunta es muy básica, pido disculpas de antemano.

Debo hacer un procedimiento almacenado que me retorne 2 campos de una consulta, el total de registros va de 0 a N.

Asi entonces, busqué un ejemplo y lo acomdé de la siguiente manera:
Código SQL:
Ver original
  1. /* Create package */
  2. CREATE OR REPLACE PACKAGE pkgGestionLeerXRutFecha3
  3. AS
  4. TYPE cursorType IS REF cursor;
  5. END;
  6. /
  7.  
  8.  
  9. CREATE OR REPLACE PROCEDURE SpGestionLeerXRutFecha3
  10. (
  11. p_rut      IN   VARCHAR2,
  12. p_ResultSet        OUT  pkgGestionLeerXRutFecha3.cursorType
  13. )
  14. AS
  15. BEGIN
  16. OPEN p_ResultSet FOR
  17.     SELECT NTIDGES, NTNOTA
  18.     FROM rsfo.RNOTAGES
  19.     WHERE NTLOTE = p_rut;
  20.  
  21. END SpGestionLeerXRutFecha3;
  22. /
[/PHP]

Lo que no sé es como testearlo (estoy trabajando con DBArtisan), el código que tengo es el siguiente (pero me arroja error en la primera línea)

Código SQL:
Ver original
  1. variable resultSet  refcursor;
  2. EXEC SpGestionLeerXRutFecha3('99556580-3', :resultSet);
  3. PRINT :resultSet;
[/PHP]


La idea de todo esto es ejecutar el procedimiento desde .net y rescatar los datos que el sp retorne, pero primero quiero validar que el sp retorna registros.

saludos

Última edición por gnzsoloyo; 18/12/2013 a las 11:19 Razón: MUY MAL etiquetado. SQL NO ES PHP.
  #2 (permalink)  
Antiguo 18/12/2013, 14:19
Avatar de pcarvajal  
Fecha de Ingreso: enero-2002
Mensajes: 701
Antigüedad: 22 años, 10 meses
Puntos: 8
Respuesta: Ejecutar procedimiento almacenado con Cursor

Estoy intentandolo de esta manera, pero me tira error :(
Código SQL:
Ver original
  1. DECLARE
  2.   v_cur SYS_REFCURSOR;
  3.   v_a   VARCHAR2(10);
  4.   v_b   VARCHAR2(100);
  5. BEGIN
  6.   SpGestionLeerXRutFecha('99556580-3',v_cur);
  7.  
  8.   LOOP
  9.     FETCH v_cur INTO v_a, v_b;
  10.     EXIT WHEN v_cur%NOTFOUND;
  11.     dbms_output.put_line(v_a || ' ' || v_b);
  12.   END LOOP;
  13.   CLOSE v_cur;
  14. END;

help!!!!!!!
  #3 (permalink)  
Antiguo 18/12/2013, 14:24
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: Ejecutar procedimiento almacenado con Cursor

¿Qué error te tira?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 18/12/2013, 14:32
Avatar de pcarvajal  
Fecha de Ingreso: enero-2002
Mensajes: 701
Antigüedad: 22 años, 10 meses
Puntos: 8
Respuesta: Ejecutar procedimiento almacenado con Cursor

Resumo:
Este es el sp y el codigo de testeo:

Código SQL:
Ver original
  1. CREATE OR REPLACE PROCEDURE SpGestionLeerXRutFecha(p_rut IN VARCHAR2, p_ResultSet OUT SYS_REFCURSOR)
  2. AS
  3. BEGIN
  4. OPEN p_ResultSet FOR
  5.     SELECT NTIDGES, NTNOTA
  6.     FROM rsfo.RNOTAGES
  7.     WHERE NTLOTE = p_rut;
  8.  
  9. END;
Código SQL:
Ver original
  1. DECLARE
  2.   v_cur SYS_REFCURSOR;
  3.   v_a   VARCHAR2(10);
  4.   v_b   VARCHAR2(100);
  5. BEGIN
  6.   SpGestionLeerXRutFecha('99556580-3',v_cur);
  7.  
  8.   LOOP
  9.     FETCH v_cur INTO v_a, v_b;
  10.     EXIT WHEN v_cur%NOTFOUND;
  11.     dbms_output.put_line(v_a || ' ' || v_b);
  12.   END LOOP;
  13.   CLOSE v_cur;
  14. END;
Y el error es este:
17:30:47.750 DBMS 10.20.1.10 -- ORA-06502: PL/SQL: numeric or value error
17:30:47.765 DBMS 10.20.1.10 -- ORA-06512: at line 9

Última edición por gnzsoloyo; 18/12/2013 a las 14:43
  #5 (permalink)  
Antiguo 18/12/2013, 14:46
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: Ejecutar procedimiento almacenado con Cursor

Empecemos por el principio: ¿estás seguro de que esa consulta devuelve algo?

Es decir, si ejecutas esto, ¿qué devuelve?:
Código SQL:
Ver original
  1. SELECT NTIDGES, NTNOTA
  2. FROM rsfo.RNOTAGES
  3. WHERE NTLOTE = '99556580-3';

En segundo lugar, ese error nos dice que hay una discrepancia de tipos de dato. Alguna de las dos columnas no es del tipo que tu supones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 18/12/2013, 14:58
Avatar de pcarvajal  
Fecha de Ingreso: enero-2002
Mensajes: 701
Antigüedad: 22 años, 10 meses
Puntos: 8
Respuesta: Ejecutar procedimiento almacenado con Cursor

Devuelve datos... el problema estaba en que el largo de la variable que recibía el dato del cursor era de largo más pequeño que el que le correspondía por definición en la tabla, por lo que cambié la declaración de esas variables y funcionó.

Dejo el código por si a alguien más le sirve:

Código SQL:
Ver original
  1. CREATE OR REPLACE PROCEDURE SpGestionLeerXRutFecha(p_rut IN VARCHAR2, p_ResultSet OUT SYS_REFCURSOR)
  2. AS
  3. BEGIN
  4. OPEN p_ResultSet FOR
  5.     SELECT NTIDGES, NTNOTA
  6.     FROM rsfo.RNOTAGES
  7.     WHERE NTLOTE = p_rut;
  8. END;
  9.  
  10.  
  11. /**** Ejemplo de Ejecución ****/
  12. DECLARE
  13.   v_cur SYS_REFCURSOR;
  14.   /*
  15.   v_a   VARCHAR2(20);
  16.   v_b   VARCHAR2(255);  
  17.   */
  18.   v_a   rsfo.RNOTAGES.NTIDGES%TYPE;
  19.   v_b   rsfo.RNOTAGES.NTNOTA%TYPE;
  20. BEGIN
  21.   SpGestionLeerXRutFecha('99556580-3',v_cur);
  22.   LOOP
  23.     FETCH v_cur INTO v_a, v_b;
  24.     EXIT WHEN v_cur%NOTFOUND;
  25.     dbms_output.put_line(v_a || '||' || v_b);
  26.   END LOOP;
  27.   CLOSE v_cur;
  28. END;
Gracias gnzsoloyo por tu tiempo!
Saludos!

Última edición por gnzsoloyo; 18/12/2013 a las 16:51 Razón: Se agradece usar el Highlight "SQL", por favor.
  #7 (permalink)  
Antiguo 18/12/2013, 16:52
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: Ejecutar procedimiento almacenado con Cursor

Perfecto. Ese es el método usual de definicion de las variables cuando estás buscando datos de una tabla.
Cuando los pones a mano, es muy común que haya errores en los tamaños o en los tipos.

Por favor, usar el Highlight "SQL". Para eso están.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: almacenado, cursor, procedimiento
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 08:13.