Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #3  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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

Última edición por Casimiro Notevi fecha: 27-10-2012 a las 20:33:12.
Responder Con Cita
  #4  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Pero consultacedula devuelve algo?, ¿lo has probado?
Responder Con Cita
  #5  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por cierto, le sobra el "dos puntos" a dd
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES :dd;
EXECUTE procedure CONSULTACEDULA(:Cedula) RETURNING_VALUES dd;
Responder Con Cita
  #6  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bastante difícil es poder ayudar sin ver ni tocar, si además dices cosas como esta:
Cita:
Empezado por novato_erick Ver Mensaje
Probe de esa manera pero me manda error.
Entonces la ayuda se vuelve casi imposible, ¿qué error?
Responder Con Cita
  #8  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #10  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Exacto casimiro el procedimiento de consulta si devuelve el valor correcto en este caso es el valor 1 como entero.
Responder Con Cita
  #11  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #12  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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...
Responder Con Cita
  #13  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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
Responder Con Cita
  #14  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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
Responder Con Cita
  #15  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por novato_erick Ver Mensaje
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
Responder Con Cita
  #16  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Cita:
Casimiro
No entiendo qué quieres decir
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...
Responder Con Cita
  #17  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
Creo que me estoy metiendo en camisa de once varas...
Responder Con Cita
  #18  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #19  
Antiguo 27-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por novato_erick Ver Mensaje
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
Responder Con Cita
  #20  
Antiguo 27-10-2012
novato_erick novato_erick is offline
Miembro
 
Registrado: ago 2010
Ubicación: Panamá
Posts: 396
Poder: 14
novato_erick Va por buen camino
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;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Llamar un procedimiento desde otro martini002 Varios 2 02-06-2012 05:58:12
condicionar un procedimiento dentro de otro procedimiento yossi Varios 7 17-05-2010 10:47:14
procedimiento dentro de procedimiento chechu Varios 6 24-11-2005 23:34:48
Ayuda, como llamar a un procedimiento desde otro procedimiento? Ariatna Varios 1 01-02-2005 04:05:35
llamar procedimiento cmgenny Varios 2 12-08-2003 00:28:13


La franja horaria es GMT +2. Ahora son las 04:48:07.


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
Copyright 1996-2007 Club Delphi