Ir al contenido



Foto

Ejecutar un Stored Procedure dentro de otro Stored Procedure


Mejor respuesta Marc , 19 noviembre 2016 - 11:41

Hola,

 

Aquí tienes una forma incluso ligeramente más simple de llamarlo.


sql
  1. CREATE OR ALTER PROCEDURE GENERA_SALIDA (
  2. AGENTE VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  3. PROVEEDOR VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  4. ALMACEN INTEGER,
  5. ORDEN INTEGER,
  6. TIPO_ORDEN INTEGER,
  7. FACTURA VARCHAR(25),
  8. NCF VARCHAR(100),
  9. FECHA DATE,
  10. VME INTEGER,
  11. USUARIO VARCHAR(25),
  12. DEVICE VARCHAR(100),
  13. TALLER INTEGER,
  14. CONTACTO VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  15. CORREO VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  16. TELEFONO VARCHAR(10) CHARACTER SET ISO8859_1,
  17. AREA INTEGER)
  18. RETURNS (
  19. ID INTEGER)
  20. AS
  21. BEGIN
  22. INSERT INTO SALIDAS_ALMACEN(SAL_NO,SAL_FECHA,SAL_AGENTE,SAL_PROVEEDOR,SAL_NCF_PROV,SAL_FACTURA,VEH_ID,SAL_OT_NO,SAL_OT_TIPO,USER_NAME,USER_DEVICE,SAL_ALMACEN,SAL_AREA,TA_ID,SAL_SUPLI_CONTACTO,SAL_SUPLI_MAIL,SAL_SUPLI_TEL)
  23. SELECT ultimo, :fecha, :agente,:proveedor,:ncf,:factura,:VME, :ORDEN,:TIPO_ORDEN,:usuario,:device,:almacen,:area,:taller,:contacto,:correo,:telefono) RETURNING SAL_ID INTO :id;
  24. FROM GETSALIDASID;
  25. END

En lugar de ejecutar el procedimiento almacenado y recuperar su parámetro de salida en una variable, lo tratamos como un dataset (esto es lo que hace el suspend en el primer procedimiento almacenado), de manera que puedes alimentar el insert del segundo SP directamente con un SELECT ULTIMO FROM GETSALIDASID, a ese parámetro de salida ULTIMO tratado si fuera como un campo cualquiera, le he añadido el resto de variables a insertar.

Ir al mensaje completo


  • Por favor identifícate para responder
3 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.160 mensajes
  • LocationRepública Dominicana

Escrito 19 noviembre 2016 - 08:18

Amigos, ¿es posible ejecutar un stored procedure dentro de otro stored procedure?, yo tengo actualmente un stored procedure que inserta datos a la BD, quisiera que luego de insertar esos datos me devuelva el resultado de otro procedure, ¿alguien me puede facilitar un ejemplo sencillo?.

 

Saludos.


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.160 mensajes
  • LocationRepública Dominicana

Escrito 19 noviembre 2016 - 09:25

Me respondo, tengo este SP:

sql
  1. CREATE OR ALTER PROCEDURE GETSALIDASID
  2. RETURNS (
  3. ULTIMO INTEGER)
  4. AS
  5. BEGIN
  6. SELECT MAX(sal_no) + 1 FROM salidas_almacen INTO :ultimo;
  7. suspend;
  8. END

Y Aquí lo utilizo en otro SP:

sql
  1. CREATE OR ALTER PROCEDURE GENERA_SALIDA (
  2. AGENTE VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  3. PROVEEDOR VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  4. ALMACEN INTEGER,
  5. ORDEN INTEGER,
  6. TIPO_ORDEN INTEGER,
  7. FACTURA VARCHAR(25),
  8. NCF VARCHAR(100),
  9. FECHA DATE,
  10. VME INTEGER,
  11. USUARIO VARCHAR(25),
  12. DEVICE VARCHAR(100),
  13. TALLER INTEGER,
  14. CONTACTO VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  15. CORREO VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  16. TELEFONO VARCHAR(10) CHARACTER SET ISO8859_1,
  17. AREA INTEGER)
  18. RETURNS (
  19. ID INTEGER)
  20. AS
  21. DECLARE variable LAST_ID INTEGER;
  22. BEGIN
  23. EXECUTE PROCEDURE GETSALIDASID returning_values last_id; /*Aquí lo llamo*/
  24. INSERT INTO SALIDAS_ALMACEN(SAL_NO,SAL_FECHA,SAL_AGENTE,SAL_PROVEEDOR,SAL_NCF_PROV,SAL_FACTURA,VEH_ID,SAL_OT_NO,SAL_OT_TIPO,USER_NAME,USER_DEVICE,SAL_ALMACEN,SAL_AREA,TA_ID,SAL_SUPLI_CONTACTO,SAL_SUPLI_MAIL,SAL_SUPLI_TEL)
  25. VALUES(:last_id,:fecha, :agente,:proveedor,:ncf,:factura,:VME, :ORDEN,:TIPO_ORDEN,:usuario,:device,:almacen,:area,:taller,:contacto,:correo,:telefono) RETURNING SAL_ID INTO :id;
  26. suspend;
  27. END

Saludos.
  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.467 mensajes
  • LocationMallorca

Escrito 19 noviembre 2016 - 11:41   Mejor respuesta

Hola,

 

Aquí tienes una forma incluso ligeramente más simple de llamarlo.


sql
  1. CREATE OR ALTER PROCEDURE GENERA_SALIDA (
  2. AGENTE VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  3. PROVEEDOR VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  4. ALMACEN INTEGER,
  5. ORDEN INTEGER,
  6. TIPO_ORDEN INTEGER,
  7. FACTURA VARCHAR(25),
  8. NCF VARCHAR(100),
  9. FECHA DATE,
  10. VME INTEGER,
  11. USUARIO VARCHAR(25),
  12. DEVICE VARCHAR(100),
  13. TALLER INTEGER,
  14. CONTACTO VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  15. CORREO VARCHAR(150) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  16. TELEFONO VARCHAR(10) CHARACTER SET ISO8859_1,
  17. AREA INTEGER)
  18. RETURNS (
  19. ID INTEGER)
  20. AS
  21. BEGIN
  22. INSERT INTO SALIDAS_ALMACEN(SAL_NO,SAL_FECHA,SAL_AGENTE,SAL_PROVEEDOR,SAL_NCF_PROV,SAL_FACTURA,VEH_ID,SAL_OT_NO,SAL_OT_TIPO,USER_NAME,USER_DEVICE,SAL_ALMACEN,SAL_AREA,TA_ID,SAL_SUPLI_CONTACTO,SAL_SUPLI_MAIL,SAL_SUPLI_TEL)
  23. SELECT ultimo, :fecha, :agente,:proveedor,:ncf,:factura,:VME, :ORDEN,:TIPO_ORDEN,:usuario,:device,:almacen,:area,:taller,:contacto,:correo,:telefono) RETURNING SAL_ID INTO :id;
  24. FROM GETSALIDASID;
  25. END

En lugar de ejecutar el procedimiento almacenado y recuperar su parámetro de salida en una variable, lo tratamos como un dataset (esto es lo que hace el suspend en el primer procedimiento almacenado), de manera que puedes alimentar el insert del segundo SP directamente con un SELECT ULTIMO FROM GETSALIDASID, a ese parámetro de salida ULTIMO tratado si fuera como un campo cualquiera, le he añadido el resto de variables a insertar.


  • 1

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.160 mensajes
  • LocationRepública Dominicana

Escrito 19 noviembre 2016 - 11:49

Muchísimas gracias Marc!, algo más que aprender!.
  • 0