Ir al contenido


Foto

Stored Procedure en firebird


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

#1 daewooding

daewooding

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 02 noviembre 2014 - 11:07

Hola que tal, soy nuevo en esto de los procedimientos en firebird y quisiera que me orientarna un poco, necesito hacer un procedimiento almacenado que inserte datos en tablas ya creadas, lo que no entiendo es como crearlo, se que la sintaxis es algo asi:

CREATE PROCEDURE nombre_procedure
AS
BEGIN
cuerpo_procedimiento
END;

y lo ejecuto con: EXECUTE PROCEDURE nombre_procedimeinto


pero no entiendo como emepzar, basicamente necesito hacer es un insert estas 3 tablas diferentes sobre un pedido, que se agregenlos datos



sql
  1. CREATE TABLE productos(
  2. idproducto INT PRIMARY KEY,
  3. nombreProducto VARCHAR(40),
  4. idProveedor INT NULL,
  5. idCategoria INT NULL,
  6. cantidadPorUnidad VARCHAR(20) NULL,
  7. precioUnidad DECIMAL NULL,
  8. unidadesEnExistencia SMALLINT NULL,
  9. unidadesEnPedido SMALLINT NULL,
  10. nivelNuevoPedido SMALLINT NULL,
  11. suspendido SMALLINT,
  12. categoriaProducto VARCHAR(20) NULL
  13. );
  14.  
  15. CREATE TABLE detallesdepedidos(
  16. idpedido INT,
  17. idproducto INT,
  18. preciounidad DECIMAL NOT NULL,
  19. cantidad INT NOT NULL,
  20. descuento DECIMAL NOT NULL
  21.  
  22. );
  23.  
  24. CREATE TABLE Pedidos(
  25. IdPedido INT PRIMARY KEY,
  26. IdCliente VARCHAR(5) NOT NULL,
  27. IdEmpleado INT NOT NULL,
  28. FechaPedido DATE,
  29. FechaEntrega DATE,
  30. FechaEnvio DATE,
  31. FormaEnvio INT,
  32. Cargo DECIMAL,
  33. Destinatario VARCHAR(60),
  34. DireccionDestinatario VARCHAR(60),
  35. CiudadDestinatario VARCHAR(60),
  36. RegionDestinatario VARCHAR(60),
  37. CodPostalDestinatario VARCHAR(60),
  38. PaisDestinatario VARCHAR(60)
  39. );





Espero me puedan ayudar ya que soy nuevo en esto de las bases de datos
  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 03 noviembre 2014 - 03:15

Basicamente esta es la estructura:



sql
  1. CREATE PROCEDURE MYPROCEDURE(
  2.     MYDATO1 INTEGER,
  3.     MYDATO2 NUMERIC(4.2))
  4. RETURNS (
  5.     SALIDA1 INTEGER,
  6.     SALIDA2 INTEGER )
  7. AS
  8.   DECLARE Fecha    DATE;
  9.   DECLARE Deci INTEGER;
  10.   DECLARE Base    NUMERIC(15,2);
  11.   DECLARE iva      NUMERIC(15,2);
  12.   DECLARE Total    NUMERIC(15,2);
  13. BEGIN
  14.   /* Rellenas variables con resultados de querys */
  15.   SELECT Moneda1Decimales FROM Empresa WHERE Empresa=1 INTO :Deci;
  16.   /* Puedes modificar o añadir records con SQL normal */
  17.   UPDATE Asiento SET IDAsiento=:IDAsiento, Fecha=:Fecha, Documento=:Doc,
  18.           FechaEntra=:Fecha, Bloqueo=1 WHERE IDAsiento=:IDAsiento;
  19.   DELETE FROM IVAApunte WHERE IDAsiento=:IDAsiento;
  20.   INSERT INTO Apunte (IDAsiento, Cuenta, CtoAuto, Concepto, Departamento, DebeHaber, Importe)
  21.           VALUES (:IDAsiento, :CtaCli, :CtoAuto, :Con, :Dpto,
  22.               iif(:Positivo=1 AND :Total<0,'H','D'), iif(:Positivo=1 AND :Total<0,-:Total,:Total));
  23.     /* Rellenas las variables de salidas y suspend envia una linea de forma que veas como una tabla creada por codigo */
  24.     suspend;
  25.   END
  26. END


  • 0

#3 daewooding

daewooding

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 03 noviembre 2014 - 07:35

No entendi bien, mira esto es lo que entiendo y llevo:




sql
  1. SET TERM ^ ;
  2. CREATE PROCEDURE ped (
  3.   IdPedido INT,
  4.   IdCliente VARCHAR(5),
  5.   IdEmpleado INT,
  6.   FechaPedido DATE,
  7.   FechaEntrega DATE,
  8.   FechaEnvio DATE,
  9.   FormaEnvio INT,
  10.   Cargo DECIMAL,
  11.   Destinatario VARCHAR(60),
  12.   DireccionDestinatario VARCHAR(60),
  13.   CiudadDestinatario VARCHAR(60),
  14.   RegionDestinatario VARCHAR(60),
  15.   CodPostalDestinatario VARCHAR(60),
  16.   PaisDestinatario VARCHAR(60))
  17.  
  18. AS
  19. BEGIN
  20.  
  21. INSERT INTO pedidos VALUES (:IdPedido, :IdCliente, :IdEmpleado, :FechaPedido, :FechaEntrega, :FechaEnvio, :FormaEnvio, 
  22. :Cargo, :Destinatario, :DireccionDestinatario, :CiudadDestinatario, :RegionDestinatario, :CodPostalDestinatario, 
  23. :PaisDestinatario);
  24. END
  25. END^
  26. SET TERM ; ^




Esto es solo para la tabla pedidos, pero no exite una manera de que haga la insersion de datos dentro del mismo procedure? osea que en ves de ejecutar :

EXECUTE PROCEDURE ped('', '', '', '', '', '', '', '', '', '', '', '', '', '')

meta los datos desde el procedure y solo ejecutar el procedure algo como EXECUTE PROCEDURE ped y ya
  • 0

#4 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 noviembre 2014 - 08:39

No entendi bien, mira esto es lo que entiendo y llevo:




sql
  1. SET TERM ^ ;
  2. CREATE PROCEDURE ped (
  3.   IdPedido INT,
  4.   IdCliente VARCHAR(5),
  5.   IdEmpleado INT,
  6.   FechaPedido DATE,
  7.   FechaEntrega DATE,
  8.   FechaEnvio DATE,
  9.   FormaEnvio INT,
  10.   Cargo DECIMAL,
  11.   Destinatario VARCHAR(60),
  12.   DireccionDestinatario VARCHAR(60),
  13.   CiudadDestinatario VARCHAR(60),
  14.   RegionDestinatario VARCHAR(60),
  15.   CodPostalDestinatario VARCHAR(60),
  16.   PaisDestinatario VARCHAR(60))
  17.  
  18. AS
  19. BEGIN
  20.  
  21. INSERT INTO pedidos VALUES (:IdPedido, :IdCliente, :IdEmpleado, :FechaPedido, :FechaEntrega, :FechaEnvio, :FormaEnvio, 
  22. :Cargo, :Destinatario, :DireccionDestinatario, :CiudadDestinatario, :RegionDestinatario, :CodPostalDestinatario, 
  23. :PaisDestinatario);
  24. END
  25. END^
  26. SET TERM ; ^




Esto es solo para la tabla pedidos, pero no exite una manera de que haga la insersion de datos dentro del mismo procedure? osea que en ves de ejecutar :

EXECUTE PROCEDURE ped('', '', '', '', '', '', '', '', '', '', '', '', '', '')

meta los datos desde el procedure y solo ejecutar el procedure algo como EXECUTE PROCEDURE ped y ya


Y de dónde va a obtener los datos que va a insertar ???  ^o|

Podría ser que insertaras a una tabla desde un select hecho a otra tabla, pero no sé si éste sea tu caso...

Saludox ! :)
  • 0

#5 daewooding

daewooding

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 03 noviembre 2014 - 10:18

Exacto, lo que necesito es insertar los "datos" dentro del mismo procedure, si se puede? de ser asi como seria? o la unica forma de insertar los datos es mediante la linea :

EXECUTE PROCEDURE ped('', '', '', '', '', '', '', '', '', '', '', '', '', '')

gracias por tus respuestas
  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 noviembre 2014 - 10:26

Exacto, lo que necesito es insertar los "datos" dentro del mismo procedure, si se puede? de ser asi como seria? o la unica forma de insertar los datos es mediante la linea :

EXECUTE PROCEDURE ped('', '', '', '', '', '', '', '', '', '', '', '', '', '')

gracias por tus respuestas


Pues lo que puedes hacer es algo así como:



sql
  1. INSERT INTO tabla (campo1, campo2, campo3, campo4)
  2. SELECT campo1, campo2, campo3, campo4
  3.   FROM tabla2
  4. WHERE condicion




Ahí lo que haces es que seleccionas los datos de una tabla para insertarlos en otra, pero al final, tienes que mandar llamar tu SP en algún momento ya sea con el execute procedure desde Firebird mismo o con un componente de conexión desde una aplicación, pero es necesario que se mande llamar al SP en algún momento.

Saludox ! :)
  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 03 noviembre 2014 - 10:28

daewooding, ¿Y quien le suministra los datos al procedimiento? ¿O de donde va a sacarlos?
Que un procedimiento se llame a si mismo no es un buen síntoma. Alguien lo invoca, pasándole en los parámetros la información o bien ejecuta una consulta y extrae los datos de la misma para luego operar con ella.

Es así como funcionan.
Se me hace que estás confundiendo los conceptos de un procedimiento almacenado. El punto es que de algún lado vienen los datos, sea de una tabla con la información o se la pasa el propio usuario. No se inventan ni salen de la galera. No hay otra. Explícate que buscas hacer y hasta donde deseas llegar. Tienes esas tablas, ahora ¿Hay otras más de donde pueda extraer los datos necesario?

Saludos,
  • 0

#8 daewooding

daewooding

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 03 noviembre 2014 - 02:12

daewooding, ¿Y quien le suministra los datos al procedimiento? ¿O de donde va a sacarlos?
Que un procedimiento se llame a si mismo no es un buen síntoma. Alguien lo invoca, pasándole en los parámetros la información o bien ejecuta una consulta y extrae los datos de la misma para luego operar con ella.

Es así como funcionan.
Se me hace que estás confundiendo los conceptos de un procedimiento almacenado. El punto es que de algún lado vienen los datos, sea de una tabla con la información o se la pasa el propio usuario. No se inventan ni salen de la galera. No hay otra. Explícate que buscas hacer y hasta donde deseas llegar. Tienes esas tablas, ahora ¿Hay otras más de donde pueda extraer los datos necesario?

Saludos,


Tratare de ser claro, lo que necesito es un procedimiento que inserte datos a las tablas, estos datos quiero ponerlos DENTRO del procedure para no tener que ponerlos al llamarlo conel EXECUTE PROCEDURE, en pocas palabras, necesito que la insercion de datos se hagan dentro del mismo procedure y cuando lo mande a llamar solo ponga

EXECUTE PROCEDURE nombre 

y no tenga que meter los datos cuando lo mande a llamar, sino que se ejecuten dentro del procedure, espero haber sido claro,

de igual manera para saber si esTo es posible o es OBLIGATORIO introducir los datos cuando lo mande a llamar con el EXECUTE
  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 noviembre 2014 - 02:27


daewooding, ¿Y quien le suministra los datos al procedimiento? ¿O de donde va a sacarlos?
Que un procedimiento se llame a si mismo no es un buen síntoma. Alguien lo invoca, pasándole en los parámetros la información o bien ejecuta una consulta y extrae los datos de la misma para luego operar con ella.

Es así como funcionan.
Se me hace que estás confundiendo los conceptos de un procedimiento almacenado. El punto es que de algún lado vienen los datos, sea de una tabla con la información o se la pasa el propio usuario. No se inventan ni salen de la galera. No hay otra. Explícate que buscas hacer y hasta donde deseas llegar. Tienes esas tablas, ahora ¿Hay otras más de donde pueda extraer los datos necesario?

Saludos,


Tratare de ser claro, lo que necesito es un procedimiento que inserte datos a las tablas, estos datos quiero ponerlos DENTRO del procedure para no tener que ponerlos al llamarlo conel EXECUTE PROCEDURE, en pocas palabras, necesito que la insercion de datos se hagan dentro del mismo procedure y cuando lo mande a llamar solo ponga

EXECUTE PROCEDURE nombre 

y no tenga que meter los datos cuando lo mande a llamar, sino que se ejecuten dentro del procedure, espero haber sido claro,

de igual manera para saber si esTo es posible o es OBLIGATORIO introducir los datos cuando lo mande a llamar con el EXECUTE


Y los datos que quieres que se encuentren dentro del procedure son fijos ? se obtienen de una tabla mediante una consulta?

Es posible tener los datos a insertar dentro del procedure ? Claro que sí !.... Bajo éstos dos supuestos que te comento con anterioridad: o éstos son fijos (que no encuentro mucha lógica en que así sea) o se obtiene mediante una consulta a una tabla (muy común).

Pero lo más común de todo, es que tú le digas a un procedimiento que inserta datos, qué datos quieres insertar... es ésto obligatorio ??? No, ya ha sido aclarado que tanto como obligatorio no es, pero es lo que normalmente se esperaría al utilizar SP.

Saludox ! :)
  • 0

#10 daewooding

daewooding

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 03 noviembre 2014 - 02:47



daewooding, ¿Y quien le suministra los datos al procedimiento? ¿O de donde va a sacarlos?
Que un procedimiento se llame a si mismo no es un buen síntoma. Alguien lo invoca, pasándole en los parámetros la información o bien ejecuta una consulta y extrae los datos de la misma para luego operar con ella.

Es así como funcionan.
Se me hace que estás confundiendo los conceptos de un procedimiento almacenado. El punto es que de algún lado vienen los datos, sea de una tabla con la información o se la pasa el propio usuario. No se inventan ni salen de la galera. No hay otra. Explícate que buscas hacer y hasta donde deseas llegar. Tienes esas tablas, ahora ¿Hay otras más de donde pueda extraer los datos necesario?

Saludos,


Tratare de ser claro, lo que necesito es un procedimiento que inserte datos a las tablas, estos datos quiero ponerlos DENTRO del procedure para no tener que ponerlos al llamarlo conel EXECUTE PROCEDURE, en pocas palabras, necesito que la insercion de datos se hagan dentro del mismo procedure y cuando lo mande a llamar solo ponga

EXECUTE PROCEDURE nombre 

y no tenga que meter los datos cuando lo mande a llamar, sino que se ejecuten dentro del procedure, espero haber sido claro,

de igual manera para saber si esTo es posible o es OBLIGATORIO introducir los datos cuando lo mande a llamar con el EXECUTE


Y los datos que quieres que se encuentren dentro del procedure son fijos ? se obtienen de una tabla mediante una consulta?

Es posible tener los datos a insertar dentro del procedure ? Claro que sí !.... Bajo éstos dos supuestos que te comento con anterioridad: o éstos son fijos (que no encuentro mucha lógica en que así sea) o se obtiene mediante una consulta a una tabla (muy común).

Pero lo más común de todo, es que tú le digas a un procedimiento que inserta datos, qué datos quieres insertar... es ésto obligatorio ??? No, ya ha sido aclarado que tanto como obligatorio no es, pero es lo que normalmente se esperaría al utilizar SP.

Saludox ! :)


Gracias por tu respuesta, por lo que dices y lo que quiero hacer es justamente con datos FIJOS como mencionas, son datos que "invento" para meterlos a las tablas, no los obtengo de otras tablas, solo necesito saber como hacer dentro el procedure los insert de datos fijos, por ejemplo en la tabla de pedidos:




sql
  1. [CREATE TABLE Pedidos(
  2.         IdPedido INT PRIMARY KEY,
  3.         IdCliente VARCHAR(5) NOT NULL,
  4.         IdEmpleado INT NOT NULL,
  5.         FechaPedido DATE,
  6.         FechaEntrega DATE,
  7.         FechaEnvio DATE,
  8.         FormaEnvio INT,
  9.         Cargo DECIMAL,
  10.         Destinatario VARCHAR(60),
  11.         DireccionDestinatario VARCHAR(60),
  12.         CiudadDestinatario VARCHAR(60),
  13.         RegionDestinatario VARCHAR(60),
  14.         CodPostalDestinatario VARCHAR(60),
  15.         PaisDestinatario VARCHAR(60)
  16. );


  • 0

#11 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 03 noviembre 2014 - 03:14

Entonces sobran los parámetros de entrada para el procedimiento.
Solo agregas la sentencia INSERT con los parámetros correctos y listo.
Sergio te dejó una guía con las cuatro instrucciones.
El tema, supongo que viene para una base de datos de prueba, por lo que sería correcto agregarle datos al azar.

Saludos.

  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 noviembre 2014 - 04:23

OK ! Datos fijos... en ese caso y como ya te hicieron mención, no necesitas parámetros de entrada...

Es suficiente con hacer ésto:



sql
  1. SET TERM ^ ;
  2. CREATE PROCEDURE ped ()
  3. AS
  4. BEGIN
  5.  
  6. INSERT INTO pedidos VALUES (valor1, valor2, valor3, valor4....);
  7. END
  8. END^
  9. SET TERM ; ^



Ojalá te sirva (y)

Saludox ! :)
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 03 noviembre 2014 - 04:36

!Ha bueno... eso cambia radicalmente las cosas! Por algo es que invitamos a los interesados a que describan lo mejor posible su problema. No te preocupes, eres nuevo, te entiendo.

Te pongo un ejemplo que tengo para mi base de datos de prueba. Dispongo de un SP que recibe como parámetro la cantidad de registros que deseo insertar. Luego en un ciclo while itero una variable hasta acumular la cantidad dada, en cada iteración se realiza un INSERT.



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE OR ALTER PROCEDURE LLENAR_TEST1 (
  4.     cantidad INTEGER)
  5. AS
  6. DECLARE variable iter INTEGER;
  7. BEGIN
  8.   /* Procedure Text */
  9.   ITER = 0;
  10.   WHILE (iter < CANTIDAD) do
  11.   BEGIN
  12.     INSERT INTO testtable1(VALORNUM, VALORFLOAT, FECHA) VALUES (:iter, 1.0 + :iter/1000.0, 'NOW');
  13.     ITER = ITER + 1;
  14.   END
  15. END^
  16.  
  17. SET TERM ; ^



Mi tabla de pruebas tiene 3 campos: uno numérico, otro de coma flotante y uno de fecha. Los valos se "inventan" según el valor de iteración. Esa es la magia de poner datos "inventados" para este burdo ejemplo.

Luego lo único que hace falta es mandar a ejecutar el procedimiento y pasarle un valor de cantidad y esperar a que termine.

Saludos,
  • 0

#14 daewooding

daewooding

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 03 noviembre 2014 - 06:31

Gracias por sus respuestas, era lo que necesitaba, disculpen mi ignorancia y para futuras consultas tratare de ser o mas claro posible desde el inicio. Gracias de nuevo y Salu2
  • 0

#15 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 03 noviembre 2014 - 07:25

Gracias por sus respuestas, era lo que necesitaba, disculpen mi ignorancia y para futuras consultas tratare de ser o mas claro posible desde el inicio. Gracias de nuevo y Salu2

No hay problema daewooding. Espero que no lo tomes como una especie de "castigo". Es normal el requerir cierto feedback en el foro para ir descubriendo tanto el problema como una posible solución o alternativa.
El asunto es que no hemos podido captar inicialmente que se trataba de datos de prueba desde el inicio. Y eso nos confundía. Por eso y para lograr un buen manejo en los foros y dar una mejor atención y calidad es que hemos elaborado unas sugerencias a tener en cuenta al momento de postear.

Tu no haz hecho nada malo. Eres nuevo en el foro, espero que sientas a esta comunidad como tu 2do hogar.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.