
PROCEDIMIENTOS ALMACENADOS
#1
Escrito 02 junio 2012 - 06:08
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
#2
Escrito 02 junio 2012 - 08:02
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
#3
Escrito 02 junio 2012 - 11:23
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.
#4
Escrito 02 junio 2012 - 12:42
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.
#5
Escrito 03 junio 2012 - 06:52
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¿?
#6
Escrito 03 junio 2012 - 07:35
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 ; !
#7
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
#8
Escrito 03 junio 2012 - 10:52
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

#9
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
#10
Escrito 04 junio 2012 - 04:11
#11
Escrito 04 junio 2012 - 10:14
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
#12
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.
#13
Escrito 05 junio 2012 - 10:06
#14
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.
#15
Escrito 06 junio 2012 - 09:21
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>
#16
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
#17
Escrito 06 junio 2012 - 10:01
Pregunta: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.
- 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
#18
Escrito 07 junio 2012 - 08:42
Escribo el procedimiento en modo comando y perfecto y luego EXECUTE PROCEDURE y funciona.
Muchisimas gracias!!!!