Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-11-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Usar variables en un strored procedure

Tengo un procedimiento en una BB.DD. en FB 2.5 definido así:
Código SQL [-]
CREATE PROCEDURE GEN_AFILIACION
RETURNS(
  CODIGO INTEGER)
AS
BEGIN
  Codigo = GEN_ID(ID_Afiliacion, 1);
END
El problema es que me acabo de dar cuenta que en la tabla sobre la que actúa la clave primaria tiene dos campos:
Código SQL [-]
CREATE TABLE Afiliacion (CodPrv SMALLINT NOT NULL, Codigo SMALLINT NOT NULL,
Nombre VARCHAR(30) NOT NULL, Ant_Codigo SMALLINT,
CONSTRAINT PK_Afiliacion PRIMARY KEY (CodPrv, Codigo))
De los dos campos de la clave, el primero de ellos (CodPrv) es fijo y va asociado a la instalación (para los que seáis de España el valor es: 13 Ciudad Real, 28 Madrid, 45 Toledo, etc.); está pensado para si en un futuro se integran las bases de datos que hay en diversas provincias en una única base de datos central. Lo que no se me ocurre es como asignar ese valor fijo CodPrv, que se guarda en una variable desde el momento que se lanza la aplicación, a la hora de ejecutar ese procedimiento. Me he vuelto loco buscando documentación.

Última edición por Casimiro Notevi fecha: 06-11-2015 a las 19:53:15.
Responder Con Cita
  #2  
Antiguo 06-11-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pásale el parámetro que necesites:
Código SQL [-]
CREATE PROCEDURE name 
 ( input_parameter_name < datatype>, ... ) 
RETURNS 
 ( output_parameter_name < datatype>, ... )
AS 
DECLARE VARIABLE variable_name < datatype>; 
BEGIN
  /* write your code here */ 
END^
Código SQL [-]
CREATE PROCEDURE GEN_AFILIACION ( iProvincia INTEGER )
RETURNS(
  CODIGO INTEGER)
AS
BEGIN
  Codigo = iProvincia || GEN_ID(ID_Afiliacion, 1);
END

Última edición por Casimiro Notevi fecha: 06-11-2015 a las 20:03:21.
Responder Con Cita
  #3  
Antiguo 07-11-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Garcias por la respuesta Casimiro. Un modelo de código similar lo había visto pero no entiendo como asignar el valor a la variable de entrada; es decir: ¿cómo le digo al procedimiento, que además vendrá lanzado desde un trigger, que por ejemplo iProvincia vale 45? En este tema de tirggers y procedires estoy muy verde y os juro que me pierdo hasta con mapa
Responder Con Cita
  #4  
Antiguo 07-11-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Me explico mejor. Entiendo que la llamada al procdure sería algo así:
Código PHP:
EXCUTE PROCEDURE GEN_AFILIACION(45); 
Ahora tengo definido un trigger de esta manera:
Código PHP:
CREATE TRIGGER Afiliacion_New_Reg FOR Afiliacion
ACTIVE BEFORE INSERT
  POSITION 0
AS
BEGIN
  
IF (NEW.Codigo IS NULLTHEN 
  
NEW.Codigo GEN_ID(ID_Afiliacion1);
END
Y definiendo el procedure como me has indicado en tu código, ¿el trigger debería quedar así?
Código PHP:
CREATE TRIGGER Afiliacion_New_Reg FOR Afiliacion
ACTIVE BEFORE INSERT
  POSITION 0
AS
BEGIN
  
IF (NEW.Codigo IS NULLTHEN 
  
NEW.Codigo GEN_AFILIACION(45);
END
Pero por lo que llevo leído en los triggers no pueden usarse variables y aquí es donde me pierdo del todo.
Responder Con Cita
  #5  
Antiguo 07-11-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que te estás liando, o seguramente no te estoy entendiendo
Tienes una tabla con 2 campos, el código de la provincia y un código incremental, supongo.
Tú das de alta un registro con esos 2 campos, tan sólo que el código incremental se genera automáticamente mediante un trigger en el before insert de la tabla.
No necesitas crear ningún stored procedure para eso.

El inconveniente que veo es que por ejemplo: provincia madrid 28 y código 1= 281. Sin embargo, la provincia Albacete es 2 y el código 81 formarían: 281 también.
Debes hacer un "cast" a ambos valores si no quieres tener problemas, bueno, bastaría con hacerle el cast a la provincia para que tenga siempre 2 caracteres,
Para ello, el campo provincia debe ser varchar(2) y rellenar con cero por la izquierda: 01, 02, etc.
Algo así: cast(new.provincia as varchar(2))

Tal vez te interese tener una clave ID autoincremental y un campo provincia+código indexado, de tipo varchar.

No sé he entendido bien.
Responder Con Cita
  #6  
Antiguo 07-11-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por la respuesta. Creo que no me he explicado bien y me has dado una pista para solucionarlo. Vamos por partes.

La tabla a la que me refiero en el ejemplo es esta:
Código SQL [-]
CREATE TABLE Afiliacion (CodPrv SMALLINT NOT NULL, Codigo SMALLINT NOT NULL, 
Nombre VARCHAR(30) NOT NULL, Ant_Codigo SMALLINT, 
CONSTRAINT PK_Afiliacion PRIMARY KEY (CodPrv, Codigo))
Como ves los dos primeros campos son los que están en la clave primaria. No se me había ocurrido ese posible problema que indicas con la clave; es evidente que poniendo el código provincial como VARCHAR(2) se elimina dicho problema.

El campo Codigo es (o debería serlo) autoincremental. Y es aquí donde me surgen las dudas: Si no estuviera el campo de la provincia no tendría problema; pero al estar ese campo en la calve primaria ¿cómo haría para crear dicho valor? Es decir, y poniendo el código provincial como VARCAHR (tienes razón: es mejor), para que fuera 011, 012, 013, etc.

Con un trigger, por lo que llevo leído y entendido, no se podría ya que en los mismos no se pueden usar variables y si se pueden usar no veo como llamar a una que está definida en el programa. Es decir: en un query podría hacer esto:
Código PHP:
Query->SQL->Text "SELECT * FROM Afiliacion WHERE CodPrv = :Provincia";
Query->ParamByName("Provincia")->AsString "45"
¿se puede hacer algo similar en un trigger?

Última edición por Casimiro Notevi fecha: 07-11-2015 a las 12:44:35.
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
Usar objetos con variables. jularaXD Varios 3 14-05-2013 11:06:20
En que momentos usar variables? Gerson12 Varios 13 08-05-2012 03:49:43
procedure con parametros variables rruffino SQL 1 05-03-2009 01:58:55
usar un procedure en varios formularios adonai Varios 21 30-03-2007 17:42:34
Número máximo de variables en un Procedure Ana Tudela Firebird e Interbase 0 26-04-2005 12:32:35


La franja horaria es GMT +2. Ahora son las 11:10:49.


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