Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   llamar procedimiento dentro de otro procedimiento (https://www.clubdelphi.com/foros/showthread.php?t=81263)

novato_erick 27-10-2012 18:44:38

llamar procedimiento dentro de otro procedimiento
 
Hola a todos como están chicos?


Trabajando un poco e tratado de realizar consultas, insert, update con procedimientos Almacenados, leyendo un poco dentro del foro había pensado en realizar dos procedimientos por aparte en firebird 2.5 para una consulta capturando el id y luego otro procedimiento para insertar. pero leyendo un poco me percate que se puede llamar el procedimiento de consulta dentro de un procedimiento para que inserte la consulta lo trate de hacer pero aun no logro correrlo correctamente:

Procedimiento de Consulta:
Código SQL [-]
SET TERM ^ ;

CREATE PROCEDURE CONSULTACEDULA(
  CEDULA VARCHAR(20) CHARACTER SET NONE COLLATE NONE)
RETURNS(
  ID INTEGER)
AS
BEGIN
  /* Procedure body */
  SELECT ID_EMPLEADOS FROM TEMPLEADOS WHERE CEDULA_EMPL =:CEDULA INTO :ID;

END^

SET TERM ; ^

Procedimiento que llama al procedimiento de consulta

Código SQL [-]
CREATE PROCEDURE ADJUNTO(
  ID INTEGER,
  HOJADVIDA CHAR(1) CHARACTER SET NONE COLLATE NONE,
  FOTO CHAR(1) CHARACTER SET NONE COLLATE NONE,
  CED CHAR(1) CHARACTER SET NONE COLLATE NONE,
  TITULOS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  REFERENCIAS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  RP CHAR(1) CHARACTER SET NONE COLLATE NONE,
  EXAM CHAR(1) CHARACTER SET NONE COLLATE NONE)
AS
DECLARE VARIABLE Cedula VARCHAR(20);
DECLARE VARIABLE dd INTEGER;
BEGIN
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES :dd;
INSERT INTO TADJUNTOSEMPL (ID_EMPLEADOS,HOJADEVIDA,FOTOCARNET,COPIACED,
                           COPIATITULOS,REFERENCIAS,RECORDPOLICIACO,EXAMEMBARAZO)
  VALUES (:dd,:HOJADVIDA,:FOTO,:CEDULA,:TITULOS,:REFERENCIAS,:RP,:EXAM);
  SUSPEND;
END;

Alguien podría orientarme que pasará?

Saludos

novato_erick

Casimiro Notevi 27-10-2012 19:04:13

Creo que te falta el suspend del primero.

Código SQL [-]
CREATE PROCEDURE CONSULTACEDULA( CEDULA VARCHAR(20) )
RETURNS( ID INTEGER ) 
AS
BEGIN
  SELECT ID_EMPLEADOS 
  FROM TEMPLEADOS 
  WHERE CEDULA_EMPL =:CEDULA 
  INTO :ID;
  
  suspend;  /* creo que te falta esto */

END

novato_erick 27-10-2012 19:47:46

lo extraño es que con el suspend es lo mismo...
cuando ingreso el numero de identificacion me manda este error...


Cita:

Validation error for column ID_EMPLEADOS, value "*** null ***".
At procedure 'ADJUNTO' line: 19, col: 1.


Código SQL [-]
CREATE PROCEDURE ADJUNTO(
  ID INTEGER,
  HOJADVIDA CHAR(1) CHARACTER SET NONE COLLATE NONE,
  FOTO CHAR(1) CHARACTER SET NONE COLLATE NONE,
  CED CHAR(1) CHARACTER SET NONE COLLATE NONE,
  TITULOS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  REFERENCIAS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  RP CHAR(1) CHARACTER SET NONE COLLATE NONE,
  EXAM CHAR(1) CHARACTER SET NONE COLLATE NONE)
AS
DECLARE VARIABLE Cedula VARCHAR(20);
DECLARE VARIABLE dd INTEGER;
BEGIN
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES :dd;
INSERT INTO TADJUNTOSEMPL (ID_EMPLEADOS,HOJADEVIDA,FOTOCARNET,COPIACED,
                           COPIATITULOS,REFERENCIAS,RECORDPOLICIACO,EXAMEMBARAZO)
  VALUES (:dd,:HOJADVIDA,:FOTO,:CEDULA,:TITULOS,:REFERENCIAS,:RP,:EXAM); /* el parametro dd no aparece lo extraño que cuando*/
  SUSPEND;                    /* lo ejecuto me trae parametro ID que no lo he puesto en ningun lado pero si esta en el procedimiento de consulta.*/    
END^

creo que el parametro dd debe ser el que trae el id del retorno del procedimiento de consulta...



Saludos

Casimiro Notevi 27-10-2012 20:34:43

¿Pero consultacedula devuelve algo?, ¿lo has probado?

Casimiro Notevi 27-10-2012 20:42:22

Por cierto, le sobra el "dos puntos" a dd
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES :dd;
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES dd;

novato_erick 27-10-2012 20:47:39

Si lo he probado y solamente ejecutando el de consulta no hay problema se me ocurria talvez haciendo esto a ver dime si me equivoco porque tampoco me hace nada:


Código SQL [-]
CREATE PROCEDURE ADJUNTO2(
  ID INTEGER CHARACTER SET NONE COLLATE NONE,
  HOJA_DVIDA CHAR(1) CHARACTER SET NONE COLLATE NONE,
  FOTO CHAR(1) CHARACTER SET NONE COLLATE NONE,
  CED CHAR(1) CHARACTER SET NONE COLLATE NONE,
  TITULOS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  REFERENCIAS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  RP CHAR(1) CHARACTER SET NONE COLLATE NONE,
  EXAM CHAR(1) CHARACTER SET NONE COLLATE NONE)
RETURNS(
  ID_CONSULTA INTEGER)
AS
BEGIN
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES(:ID_CONSULTA);
  BEGIN
     INSERT INTO TADJUNTOSEMPL (ID_EMPLEADOS,HOJADEVIDA,FOTOCARNET,COPIACED,
                           COPIATITULOS,REFERENCIAS,RECORDPOLICIACO,EXAMEMBARAZO)
  VALUES (:ID_CONSULTA,:HOJA_DVIDA,:FOTO,:CEDULA,:TITULOS,:REFERENCIAS,:RP,:EXAM);
  END
  SUSPEND;
END;

Probe de esa manera pero me manda error.


Saludos

Casimiro Notevi 27-10-2012 20:50:02

Bastante difícil es poder ayudar sin ver ni tocar, si además dices cosas como esta:
Cita:

Empezado por novato_erick (Mensaje 448136)
Probe de esa manera pero me manda error.

Entonces la ayuda se vuelve casi imposible, ¿qué error? :confused:

novato_erick 27-10-2012 20:51:17

Ok lo deje asi:

Código SQL [-]
CREATE PROCEDURE ADJUNTO(
  ID INTEGER,
  HOJADVIDA CHAR(1) CHARACTER SET NONE COLLATE NONE,
  FOTO CHAR(1) CHARACTER SET NONE COLLATE NONE,
  CED CHAR(1) CHARACTER SET NONE COLLATE NONE,
  TITULOS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  REFERENCIAS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  RP CHAR(1) CHARACTER SET NONE COLLATE NONE,
  EXAM CHAR(1) CHARACTER SET NONE COLLATE NONE)
AS
DECLARE VARIABLE Cedula VARCHAR(20);
DECLARE VARIABLE dd INTEGER;
BEGIN
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES dd;
INSERT INTO TADJUNTOSEMPL (ID_EMPLEADOS,HOJADEVIDA,FOTOCARNET,COPIACED,
                           COPIATITULOS,REFERENCIAS,RECORDPOLICIACO,EXAMEMBARAZO)
  VALUES (:dd,:HOJADVIDA,:FOTO,:CEDULA,:TITULOS,:REFERENCIAS,:RP,:EXAM);
  SUSPEND;
END^

Pero me manda este error:

Cita:

Validation error for column ID_EMPLEADOS, value "*** null ***".
At procedure 'ADJUNTO' line: 19, col: 1.
en mi db si existe ese empleado con esa identificacion

pero me manda ese error...

Saludos

Casimiro Notevi 27-10-2012 20:59:57

Hola, pero ¿has comprobado que consultacedula devuelve un valor correcto?.
No pregunto si existe el empleado en la tabla, pregunto si el procedure devuelve el valor correctamente.

novato_erick 27-10-2012 21:08:09

Exacto casimiro el procedimiento de consulta si devuelve el valor correcto en este caso es el valor 1 como entero.

Casimiro Notevi 27-10-2012 21:11:53

Y si ejecutas "a mano" este insert, con el valor '1', tal y como dices, ¿qué resultado obtienes?

Código SQL [-]
INSERT INTO TADJUNTOSEMPL (
  ID_EMPLEADOS,HOJADEVIDA,FOTOCARNET,COPIACED,
  COPIATITULOS,REFERENCIAS,RECORDPOLICIACO,EXAMEMBARAZO)
VALUES (1, :HOJADVIDA,:FOTO,:CEDULA,:TITULOS,:REFERENCIAS,:RP,:EXAM);
Sustituye las variables por valores que sabes que existen y prueba.

novato_erick 27-10-2012 21:15:47

Cita:

Casimiro Notevi:

Y si ejecutas "a mano" este insert, con el valor '1', tal y como dices, ¿qué resultado obtienes?

Realiza el Insert en la Tabla TADJUNTOSEMPL...

novato_erick 27-10-2012 21:20:05

En realidad ya habia hecho un scrip realizando la consulta y luego haciendo el insert todo me salio bien por eso quise realizar el procedimiento almacenado ya que por lo general siempre voy a tener que realizar la consulta de empleado para agregar datos a diferentes tablas pero siempre necesitare ese id del empleado.

saludos

pd: e aqui el link cuando realice la consulta http://www.clubdelphi.com/foros/showthread.php?t=81195

novato_erick 27-10-2012 21:33:42

Vuelvo a empezar a ver en que parte me estoy equivocando:

Este es mi procedimiento de Consulta:

Código SQL [-]
SET TERM ^ ;

CREATE PROCEDURE CONSULTACEDULA(
  CEDULA VARCHAR(20) CHARACTER SET NONE COLLATE NONE)
RETURNS(
  ID INTEGER)
AS
BEGIN
  /* Procedure body */
  SELECT ID_EMPLEADOS FROM TEMPLEADOS WHERE CEDULA_EMPL =:CEDULA INTO :ID;
  suspend;
END^

SET TERM ; ^

No hay problema ya que si funciona correctamente

ahora hago prueba haciendo esto:
Código SQL [-]
 EXECUTE procedure CONSULTACEDULA(:Cedula)
y lo hace me devuelve mi id;

ahora el procedimiento para llamar a consulta y realizar insercion:

Código SQL [-]
CREATE PROCEDURE ADJUNTO(
  ID_EMPL INTEGER,
  HOJADVIDA CHAR(1) CHARACTER SET NONE COLLATE NONE,
  FOTO CHAR(1) CHARACTER SET NONE COLLATE NONE,
  CED CHAR(1) CHARACTER SET NONE COLLATE NONE,
  TITULOS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  REFERENCIAS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  RP CHAR(1) CHARACTER SET NONE COLLATE NONE,
  EXAM CHAR(1) CHARACTER SET NONE COLLATE NONE)
  RETURNING_VALUES ID_CEDULA INTEGER
AS
DECLARE VARIABLE CEDULA VARCHAR(20);
DECLARE VARIABLE ID INTEGER;
BEGIN
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES ID;
INSERT INTO TADJUNTOSEMPL (ID_EMPLEADOS,HOJADEVIDA,FOTOCARNET,COPIACED,
                           COPIATITULOS,REFERENCIAS,RECORDPOLICIACO,EXAMEMBARAZO)
  VALUES (:ID,:HOJADVIDA,:FOTO,:CEDULA,:TITULOS,:REFERENCIAS,:RP,:EXAM);
  SUSPEND;
END^

es aqui donde no se que pasa ya que en el primer parametro me pone

1 parametro: ID_EMPL =
2 Parametro: HOJADVIDA =
3 Parametro: FOTO =
4 Parametro: CED =
5 Parametro: TITULOS =
6 Parametro: REFERENCIAS =
7 Parametro: RP =
8 Parametro: EXAM =

En fin no me hace el Excecute para devolver el valor y ponerlo en el primer parametro que es id_empl

Casimiro Notevi 27-10-2012 21:43:48

Cita:

Empezado por novato_erick (Mensaje 448147)
es aqui donde no se que pasa ya que en el primer parametro me pone

1 parametro: ID_EMPL =
2 Parametro: HOJADVIDA =
3 Parametro: FOTO =
4 Parametro: CED =
5 Parametro: TITULOS =
6 Parametro: REFERENCIAS =
7 Parametro: RP =
8 Parametro: EXAM =

En fin no me hace el Excecute para devolver el valor y ponerlo en el primer parametro que es id_empl

No entiendo qué quieres decir :confused:

novato_erick 27-10-2012 21:47:28

Cita:

Casimiro
No entiendo qué quieres decir :confused:
Tengo ya los parámetros de entrada en esta parte:

Código SQL [-]
CREATE PROCEDURE ADJUNTO(
  ID_EMPL INTEGER,
  HOJADVIDA CHAR(1) CHARACTER SET NONE COLLATE NONE,
  FOTO CHAR(1) CHARACTER SET NONE COLLATE NONE,
  CED CHAR(1) CHARACTER SET NONE COLLATE NONE,
  TITULOS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  REFERENCIAS CHAR(1) CHARACTER SET NONE COLLATE NONE,
  RP CHAR(1) CHARACTER SET NONE COLLATE NONE,
  EXAM CHAR(1) CHARACTER SET NONE COLLATE NONE)
  RETURNING_VALUES ID_CEDULA INTEGER

y entiendo que cuando ejecuto el excecute el id debe de traerlo retornado... pero no sucede eso...

novato_erick 27-10-2012 22:03:20

Creo que me estoy metiendo en camisa de once varas...

Casimiro Notevi 27-10-2012 22:25:02

Veamos, he hecho un ejemplo muy, muy simple:

Tengo un par de tablas:

Código SQL [-]
CREATE TABLE EJEMPLO(
  ID ENTERO DEFAULT 0 NOT NULL,
  VALUE1 ENTERO DEFAULT 0 NOT NULL,
  VALUE2 ENTERO DEFAULT 0 NOT NULL,
  PEPITO Integer,
  OTRO Varchar(18384),
  MASGRANDE Varchar(32000),
  CONSTRAINT PK_EJEMPLO PRIMARY KEY (ID)
);

CREATE TABLE EJEMPLO2(
  ID ENTERO DEFAULT 0 NOT NULL,
  VALUE1 ENTERO DEFAULT 0 NOT NULL,
  VALUE2 ENTERO DEFAULT 0 NOT NULL,
  PRIMARY KEY (ID)
);

Creo un par de stored procedure, uno llama al otro, retorna un valor y es usado para insertar en otra tabla

Código SQL [-]
CREATE PROCEDURE AA1 ( VALOR Integer )
RETURNS ( DEVOLVER Integer )
AS
BEGIN
  select id 
  from ejemplo
  where value1= :valor
  into :devolver;
END^

Código SQL [-]
CREATE PROCEDURE BB1
AS
DECLARE VARIABLE valor integer; 
BEGIN
  execute procedure aa1 (5) RETURNING_VALUES valor;
  insert into ejemplo2 values (:valor, 10,10 );
END^

Como ves, el procedure BB1 llama al procedure AA1 con el parámetro '5' y devuelve el campo ID de la otra tabla

La tabla ejemplo tiene el registro:
id 1
value1 5
etc.


Ejecuto el mismo;
Código SQL [-]
execute procedure BB1

Y si miro la tabla ejemplo2 tiene el registro insertado con el valor correspondiente, id=1

Casimiro Notevi 27-10-2012 22:39:46

Cita:

Empezado por novato_erick (Mensaje 448149)
y entiendo que cuando ejecuto el excecute el id debe de traerlo retornado... pero no sucede eso...

Pero si antes has dicho que sí devuelve el valor, que lo has comprobado :confused:

novato_erick 27-10-2012 23:02:51

Cita:

execute procedure aa1 (5) RETURNING_VALUES valor;
El 5 es el valor ya en la tabla el problema esta es cuando pongo

Código SQL [-]
execute procedure aa1 (:num) RETURNING_VALUES valor;


La franja horaria es GMT +2. Ahora son las 15:25:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi