Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Procedimiento almacenado + condicion (https://www.clubdelphi.com/foros/showthread.php?t=70653)

mjjj 03-11-2010 17:52:17

Procedimiento almacenado + condicion
 
Hola, muy buenas.Utilizo Firebird 2.0, y quiero utilizar un procedimiento almacanado para guardar un registro en la tabla "CLAVES".

Utilizo esto... no puedo ocupar la herramiento para escribir texto SQL.

create or alter procedure INGRESO_USUARIO (USUARIO varchar(4),
CLAVE varchar(8),
NOMBRE varchar(35),
EMAIL varchar(50),
RUT varchar(50),
NACIMIENTO date) asdeclare variable ID integer;
begin
SELECT coalesce(MAX(ID_USUARIO),0) + 1 FROM CLAVES INTO ID;

INSERT INTO claves (ID_USUARIO, USUARIO, CLAVE, NOMBRE, EMAIL, RUT, NACIMIENTO) VALUES (:ID, :USUARIO, :CLAVE, :NOMBRE, :EMAIL, :RUT, :NACIMIENTO);

end


Con esto tengo resuelto el problema de la columna con clave primaria "ID_USUARIO", ahora bien puede ocurrir que se ingresen mas de un registro iguales para la columna "USUARIO", lo cual no está bien, pero tampoco me va a generar un problema en la BD, ya que tengo la clave primaria distinta.
Por otro lado quise utilizar una clave primaria compuesta por los campos ID_USUARIO Y USUARIO, tampoco me sirve.Entonces se me ocurrio la idea de agregar una consulta en el procedimiento, que cheque antes de guardar el registro, si existe un registro con el mismo campo "USUARIO", en caso que si existe me arroje un mensaje... como se puede hacer esto??

Espero me puedan ayudar.

cloayza 03-11-2010 21:41:41

Amigo te reocmiendo hacer lo siguiente:

1) Si deseas tener un valor correlativo para ID_USUARIO, utiliza un generador para ese campo.

Código SQL [-]

CREATE GENERATOR GEN_USUARIOS_ID;    
SET GENERATOR GEN_USUARIOS_ID TO 0;

CREATE TRIGGER USUARIOS_BI FOR USUARIOS
ACTIVE BEFORE INSERT POSITION 0                   
AS                                                
BEGIN                                             
     IF (NEW.ID_USUARIO IS NULL) THEN                
        NEW.ID_USUARIO = GEN_ID(GEN_USUARIOS_ID,1);
END

2) Te recomiento que uses una clave unica para el campo USUARIO, asi no tendrias usuarios repetidos.
Código SQL [-]
ALTER TABLE USUARIOS ADD CONSTRAINT UNQ1_USUARIOS UNIQUE (USUARIO);

3) Para controlar que solo se ingrese un usuario unico podrias usar una exception
Código SQL [-]
CREATE EXCEPTION ERROR_KEY_VIOLATION 
'Usuario ya existe!';

CREATE TRIGGER USUARIOS_BI FOR USUARIOS
ACTIVE BEFORE INSERT POSITION 0                   
AS                                                
BEGIN                                             
     IF (NEW.ID_USUARIO IS NULL) THEN                
        NEW.ID_USUARIO = GEN_ID(GEN_USUARIOS_ID,1);

    WHEN SQLCODE -803 DO        
             EXCEPTION ERROR_KEY_VIOLATION;
END

Olvide incluir tu codigo
Código SQL [-]
CREATE OR ALTER PROCEDURE INGRESO_USUARIO (USUARIO varchar(4),
      CLAVE varchar(8),
      NOMBRE varchar(35),
      EMAIL varchar(50),
      RUT varchar(50),
      NACIMIENTO date) asdeclare variable ID integer;
BEGIN
       --Estaria de mas por lo mensionado en el punto 1
       --SELECT coalesce(MAX(ID_USUARIO),0) + 1 FROM CLAVES INTO ID;

       INSERT INTO claves (ID_USUARIO, USUARIO, CLAVE, NOMBRE, EMAIL, RUT, NACIMIENTO) VALUES (NULL , :USUARIO, :CLAVE, :NOMBRE, :EMAIL, :RUT, :NACIMIENTO);
END
Bueno eso por ahora, espero te sirva...

Un abrazo


La franja horaria es GMT +2. Ahora son las 06:30:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi