Ir al contenido


Foto

PROCEDIMIENTOS ALMACENADOS


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

#1 maribeth

maribeth

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 02 junio 2012 - 06:08

Hola.
Tengo creados algunos procedimientos almacenados, algunos trigger y cursores para mysql, le he cambiado alguna cosilla para firebird pero tengo problemas al cargarlo a la base de datos desde mysql es source nombre_procedimiento pero como es en firebird¿?
GRACIAS DE ANTEMANO
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 02 junio 2012 - 08:02

Hola maribeth, bienvenida al foro, siéntete  como en casa.

Te ilustro la declaración de SP en Firebird con un ejemplo:


SET TERM ^ ;

CREATE OR ALTER PROCEDURE GENERAR_UN_VALOR (
    PARAMETRO_ENTRADA VARCHAR(20),
PARAMETRO_ENTRADA2 INTEGER)
RETURNS (
    VALOR INTEGER)
AS
DECLARE VARIABLE MI_VARIABLE INTEGER;
BEGIN
  SELECT UN_VALOR_ENTERO FROM TABLA INTO :MI_VARIABLE;

  IF (PARAMETRO_DE_ENTRADA = 'MULTIPLICAR') THEN
  VALOR = :MI_VARIABLE * :PARAMETRO_ENTRADA2;

  IF (PARAMETRO_DE_ENTRADA = 'SUMAR') THEN
  VALOR = :MI_VARIABLE + :PARAMETRO_ENTRADA2;
END^

/* AQUÍ PUEDE PONER MÁS PROCEDIMIENTOS ALMACENADOS O TRIGGERS */

SET TERM ; ^


En donde el nombre del SP es GENERAR_UN_VALOR,  PARAMETRO_DE_ENTRADA es un parámetro de entrada (podrían ser varios separados por comas o ninguno), VALOR es el valor de retorno o parámetro de salida (podrían ser varios  separados por comas o ninguno) , entre la palabra reservada AS y BEGIN puedes declarar ninguna, una o varias variables separadas por "puntoycomas" y lo que está entre BEGIN Y END es el cuerpo del SP.

Saludos

PD: Con la expresión  " SET TERM ^ ;" le estás indicando al motor de Firebird, el  caracter de terminación que usarás (en este caso el acento circunflejo)  y se debe colocar "SET TERM ; ^" al final de un conjunto de declaraciones de TRIGGERS o SPS..

Te coloco la sintaxis completa.


CREATE PROCEDURE NOMBRE_PROCEDIMIENTO
[(parametro_entrada1 <tipo_de_dato>, parametro_entrada2 <tipo_de_dato> ...) ]
RETURNS [(parametro_salida1 <tipo_de_dato>, parametro_salida2 <tipo_de_dato>...)]
AS
[DECLARE VARIABLE var1 <tipo_de_dato>,
DECLARE VARIABLE var2 <tipo_de_dato>...]
BEGIN
<cuerpo_del_procedimiento>
END

  • 0

#3 mightydragon_lord

mightydragon_lord

    Advanced Member

  • Miembros
  • PipPipPip
  • 73 mensajes

Escrito 02 junio 2012 - 11:23

Adicionalmente si vas a ejecutar un procedimiento almacenado en Firebird debes tener en cuenta que si es un sp de consulta le haces:
Select <Variables de salida> FROM procedimiento almacenado

Si no es un sp de selección:
EXECUTE PROCEDURE procedimeinto almacenado

Esto te puede ayudar http://www.firebirds...5-execproc.html

Saludos.
  • 0

#4 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 02 junio 2012 - 12:42

Hola.

Si nos indicas el código del procedimiento almacenado, y el código de error que te devuelve al intentar crearlo, te podremos ayudar. En caso contrario es realmente difícil echarte una mano.

Saludos.
  • 0

#5 maribeth

maribeth

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 03 junio 2012 - 06:52

muchas gracias a todos.
Este es el procedimiento almacenado y tengo que conseguir que permita insertar, modificar y borrar en la tabla  empleados dependiendo de los parámetros pasados:
Operación 1- insertar, 2- modificar, 3- borrar.
Campos a insertar, modificar o borra: Dni, nombre,salario, num_dep.
Se borrara por dni

SET TERM !! ;
CREATE OR ALTER PROCEDURE proc1 (IN A int, dni VARCHAR(9), nombre VARCHAR(10), salario FLOAT, num_dep VARCHAR(10))
AS

DECLARE VARIABLE A int DEFAULT 0;
DECLARE VARIABLE B INT DEFAULT 0;
DECLARE VARIABLE C INT DEFAULT 0;
BEGIN
IF (A = 1)
THEN INSERT INTO Empleados (dni, nombre, salario, num_dep ) VALUES (dni, nombre, salario,num_dep);
ELSE
IF (A = 2)
THEN UPDATE Empleados SET nombre=NEW.nombre, salario=NEW.salario, num_dep=NEW.salario;
ELSE
IF (A = 3)
THEN DELETE FROM Empleados WHERE dni=dni;
END IF;
END IF;
END IF;

END !!
SET TERM ; !!


SQL> EXECUTE PROCEDURE proc1.sql;
Statement failed, SQLCODE = -104
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 1, column 24
-.
SQL>


Por cierto la mayor duda que tengo es que no se como subirlo o cargarlo a la base de datos, se que se puede ejecutar con select o execute. Como lo hago escribo el procedimiento en modo comando y luego lo ejecuto o se puede como en mysql con source proc1.sql¿?
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 03 junio 2012 - 07:35

Tu procedimiento tiene varios errores (estabas usando la palabra reservada IN, un tipo de dato INT que no existe en Firebird, así como el uso de NEW en procedimientos no se usa),para lo que planteas  también te sobran las variables, sin conocer a fondo la estructura de tu tabla, el procedimiento corregido quedaría más o menos así:


SET TERM ! ;
CREATE OR ALTER PROCEDURE proc1 (A INTEGER, dni VARCHAR(9), nombre VARCHAR(10), salario FLOAT, num_dep VARCHAR(10))
AS
BEGIN
  IF (A = 1)
      THEN INSERT INTO Empleados (dni, nombre, salario, num_dep ) VALUES (:dni, :nombre, :salario,:num_dep);
  ELSE
      IF (A = 2)
        THEN UPDATE Empleados SET nombre= :nombre, salario= :salario, num_dep= :num_dep WHERE dni = :dni;
  ELSE
      IF (A = 3)
        THEN DELETE FROM Empleados WHERE dni=:dni;
END !
SET TERM ; !

  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 03 junio 2012 - 07:45

Por cierto la mayor duda que tengo es que no se como subirlo o cargarlo a la base de datos, se que se puede ejecutar con select o execute. Como lo hago escribo el procedimiento en modo comando y luego lo ejecuto o se puede como en mysql con source proc1.sql¿?


Para  mayor comodidad baja de aquí la versión free de IBExpert, registra tu Base de Datos, te conectas a ella y corres el script.

Ahora para ejecutar el procedimiento sería:


EXECUTE PROCEDURE proc1 (parametro1, parametro2, parametro3, parametro4)


Saludos
  • 0

#8 maribeth

maribeth

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 03 junio 2012 - 10:52

Muchisimas gracias.
Ahora me lo he instalado en windows 7 (porque antes estaba trabajando en ubuntu)  y haber si puedo terminar el trabajo a tiempo. Si tengo alguna duda ya volvere a molestarles otra vez  :smiley: y gracias de nuevo
  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 03 junio 2012 - 11:03

Ahora me lo he instalado en windows 7 (porque antes estaba trabajando en ubuntu).


Para Linux, aquí  http://www.flamerobin.org/ hay un aplicación para administrar Firebird.

Haber si puedo terminar el trabajo a tiempo. Si tengo alguna duda ya volvere a molestarles otra vez.


Con mucho gusto te ayudaremos en lo que esté a nuestro alcance.

Un saludo
  • 0

#10 Sergio

Sergio

    Advanced Member

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

Escrito 04 junio 2012 - 04:11

Aparte del IN que tienes al empezar los parametros (que sobra), también veo que un parámetro de entrada se llama A y una variable interna también se llama A... esos dos errores tienes que solventarlos antes de nada, y si tras eso aun te da errores, reenvia el código corregiso a ver si hay más cosas.
  • 0

#11 maribeth

maribeth

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 04 junio 2012 - 10:14

GRACIAS.
Lo de la variable A es porque el usuario tiene que indicar que quiere hacer, si quiere insertar, modificar o borrar y bueno en mysql pero en firebird no se como es
  • 0

#12 Sergio

Sergio

    Advanced Member

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

Escrito 05 junio 2012 - 03:41

GRACIAS.
Lo de la variable A es porque el usuario tiene que indicar que quiere hacer, si quiere insertar, modificar o borrar y bueno en mysql pero en firebird no se como es


Pues si es un parámetro de entrada ya no lo tienes que declarar como variable, exactamente como en delphi.
  • 0

#13 maribeth

maribeth

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 05 junio 2012 - 10:06

No tengo que declararlo y entonces como tendria que hacerlo¿?
  • 0

#14 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 05 junio 2012 - 10:20

No tengo que declararlo y entonces como tendria que hacerlo¿?


Si ya has declarado A como parámetro de entrada, entonces no puedes declarar una variable con el mismo identificador.
  • 0

#15 maribeth

maribeth

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 06 junio 2012 - 09:21

Tienes toda la razon, perdona estaba equivocadisima!
Este es el codigo que pongo en modo comando, estando dentro de la base de datos pero me da error y no se como utilizar el execute y el select.
SQL> SET TERM !! ;
SQL> CREATE OR ALTER PROCEDURE proc1 (IN A int, dni1 VARCHAR(9), nombre VARCHAR(9), salario FLOAT, num_dep VARCHAR(10))
CON> AS                                                                                           
CON> BEGIN
CON> IF (A = 1)                                                                                   
CON> THEN INSERT INTO Empleados (dni, nombre, salario, num_dep) VALUES (dni1, nombre, salario, num_dep);
CON> ELSE
CON> IF (A = 2)
CON> THEN UPDATE Empleados SET nombre=nombre, salario=salario, num_dep=num_dep where dni=dni1;
CON> ELSE
CON> IF (A = )
CON> THEN DELETE FROM Empleados WHERE dni=dni1;
CON> END IF;
CON> END IF;
CON> END IF;
CON> END !!
Statement failed, SQLCODE = -104
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 1, column 34
-IN
SQL>

  • 0

#16 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 06 junio 2012 - 09:48

Tienes toda la razon, perdona estaba equivocadisima!
Este es el codigo que pongo en modo comando, estando dentro de la base de datos pero me da error y no se como utilizar el execute y el select.

SQL> SET TERM !! ;
SQL> CREATE OR ALTER PROCEDURE proc1 (IN A int, dni1 VARCHAR(9), nombre VARCHAR(9), salario FLOAT, num_dep VARCHAR(10))
CON> AS                                                                                           
CON> BEGIN
CON> IF (A = 1)                                                                                   
CON> THEN INSERT INTO Empleados (dni, nombre, salario, num_dep) VALUES (dni1, nombre, salario, num_dep);
CON> ELSE
CON> IF (A = 2)
CON> THEN UPDATE Empleados SET nombre=nombre, salario=salario, num_dep=num_dep where dni=dni1;
CON> ELSE
CON> IF (A = )
CON> THEN DELETE FROM Empleados WHERE dni=dni1;
CON> END IF;
CON> END IF;
CON> END IF;
CON> END !!
Statement failed, SQLCODE = -104
Dynamic SQL Error
-SQL error code = -104
-Token unknown - line 1, column 34
-IN
SQL>


Yo ya te había corregido este procedimiento, prueba con el procedimiento que te di en la respuesta #5, en el cual ya estaba resuelto lo que posteriormente te indicaron Sergio y Marc. Yo ya te había dicho que las variables sobraban y que no podías utilizar la palabra reservada IN como un nombre de parámetro.

Saludos

Saludos
  • 0

#17 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 06 junio 2012 - 10:01

Tienes toda la razon, perdona estaba equivocadisima!
Este es el codigo que pongo en modo comando, estando dentro de la base de datos pero me da error y no se como utilizar el execute y el select.

Pregunta:

- De donde pretendes obtener los parámetros que le quieres pasar a dicho procedimiento?  O sea en que proceso de tu aplicación  quieres llamar el procedimiento?

Si nos aclaras eso podremos decirte con claridad como pasarle los parámetros y como ejecutar el procedimiento. Eso también ya te lo había explicado:


EXECUTE PROCEDURE proc1 (parametro1, parametro2, parametro3, parametro4, parametro5)


Tómate tu tiempo, organiza tus ideas y no dudes en consultar lo que desees.

Saludos



  • 0

#18 maribeth

maribeth

    Member

  • Miembros
  • PipPip
  • 10 mensajes

Escrito 07 junio 2012 - 08:42

Jo perdon! estaba en la parra.
Escribo el procedimiento en modo comando y perfecto y luego EXECUTE PROCEDURE y funciona.
Muchisimas gracias!!!!
  • 0




IP.Board spam blocked by CleanTalk.