
26/11/2008, 09:36
|
| | Fecha de Ingreso: noviembre-2008
Mensajes: 2
Antigüedad: 16 años, 4 meses Puntos: 0 | |
Sintaxis correcta de procedure para almacenar datos en variables y manipular tablas Hola amigos, estoy tratando de hacer un procedure para recibir vendedores, pero desconozco la sintaxis, alguien tendria la amabilidad de ayudame ?
mi vendedor tiene un codigo alfanumérico, pero internamente tiene un id numerico, necesito saber si ya existe el codigo y obtener el id, si no existe agregarlo, pero el nombre es igualmente un id de una tabla de nombres,
asi que al recibir mis datos, primero tengo que buscar los nombres, obtener el id de nombre de pila y apellido, buscar la combinacion en la tabla bombres, si no lo encuentro lo agrego y regreso el id.
Código:
CREATE TABLE CAR_NOMPIL (
IDNOMPIL INTEGER NOT NULL,
NOMBRE VARCHAR(50) NOT NULL,
PRIMARY KEY (IDNOMPIL),
UNIQUE (NOMBRE)
);
CREATE TABLE CAR_APELLIDOS (
IDAPELLIDO INTEGER NOT NULL,
APELLIDO VARCHAR(50) NOT NULL,
PRIMARY KEY (IDAPELLIDO),
UNIQUE (APELLIDO)
);
CREATE TABLE CAR_NOMBRES (
IDNOMBRE" INTEGER NOT NULL,
IDAPPAT INTEGER NOT NULL,
IDAPMAT INTEGER NOT NULL,
IDNOM1 INTEGER NOT NULL,
IDNOM2 INTEGER NOT NULL,
NOMCOMP VARCHAR(200) NOT NULL,
PRIMARY KEY (IDNOMBRE),
UNIQUE (NOMCOMP),
UNIQUE (IDAPPAT,IDAPMAT,IDNOM1,IDNOM2)
);
mi tabla de vendedor
Código:
CREATE TABLE VENDEDOR (
CODIGO CHAR(3),
NOMBRE CHAR(20),
IDVND INTEGER,
IDNOMBRE INTEGER);
mi procedure ( en otra base de datos Solid SQL Server )
Código:
"CREATE PROCEDURE BUSNOMBRE ( APPAT VARCHAR(50), APMAT VARCHAR(50), NOM1 VARCHAR(50), NOM2 VARCHAR(50))
RETURNS(IDNOMBRE INTEGER)
BEGIN
DECLARE IDNOM1 INTEGER;
DECLARE IDNOM2 INTEGER;
DECLARE IDAPPAT INTEGER;
DECLARE IDAPMAT INTEGER;
DECLARE ANTIDAPPAT INTEGER;
DECLARE ANTIDAPMAT INTEGER;
DECLARE ANTIDNOMB1 INTEGER;
DECLARE ANTIDNOMB2 INTEGER;
DECLARE NOMCOMP_Z VARCHAR(200);
APPAT := LTRIM(RTRIM(APPAT));
APMAT := LTRIM(RTRIM(APMAT));
NOM1 := LTRIM(RTRIM(NOM1));
NOM2 := LTRIM(RTRIM(NOM2));
NOMCOMP_Z := RTRIM( RTRIM(RTRIM(APPAT + ' ' + APMAT) + ' ' + NOM1) + ' ' + NOM2);
EXEC SQL PREPARE BUSNOMBRE1 SELECT IDNOMBRE,IDAPPAT, IDAPMAT, IDNOM1, IDNOM2
FROM CAR_NOMBRES A
WHERE NOMCOMP = ?;
EXEC SQL PREPARE BUSNOMBRE4 CALL CAR_BUSNOM(?);
EXEC SQL PREPARE BUSNOMBRE8 CALL CAR_BUSNOM2(?);
EXEC SQL PREPARE BUSNOMBRE5 CALL CAR_BUSAPELLIDO(?);
EXEC SQL PREPARE BUSNOMBRE7 CALL CAR_BUSAPELLI2(?);
EXEC SQL PREPARE BUSNOMBRE2 SELECT MAX(IDNOMBRE) FROM CAR_NOMBRES WHERE IDNOMBRE > 0;
EXEC SQL PREPARE BUSNOMBRE3 INSERT INTO CAR_NOMBRES (IDNOMBRE, IDAPPAT, IDAPMAT, IDNOM1, IDNOM2, NOMCOMP)
VALUES (?,?,?,?,?,?);
EXEC SQL PREPARE BUSNOMBRE6 UPDATE CAR_NOMBRES
SET IDAPPAT=?, IDAPMAT=?, IDNOM1=?, IDNOM2=? WHERE IDNOMBRE=?;
EXEC SQL EXECUTE BUSNOMBRE4 USING(NOM1) INTO (IDNOM1);
EXEC SQL FETCH BUSNOMBRE4;
EXEC SQL EXECUTE BUSNOMBRE8 USING(NOM2) INTO (IDNOM2);
EXEC SQL FETCH BUSNOMBRE8;
EXEC SQL EXECUTE BUSNOMBRE5 USING(APPAT) INTO (IDAPPAT);
EXEC SQL FETCH BUSNOMBRE5;
EXEC SQL EXECUTE BUSNOMBRE7 USING(APMAT) INTO (IDAPMAT);
EXEC SQL FETCH BUSNOMBRE7;
EXEC SQL EXECUTE BUSNOMBRE1 USING (NOMCOMP_Z) INTO (IDNOMBRE, ANTIDAPPAT, ANTIDAPMAT, ANTIDNOMB1, ANTIDNOMB2);
EXEC SQL FETCH BUSNOMBRE1;
IF SQLSUCCESS = 1 THEN
IF (ANTIDAPPAT <> IDAPPAT) OR (ANTIDAPMAT <> IDAPMAT) OR (ANTIDNOMB1 <> IDNOM1) OR (ANTIDNOMB2 <> IDNOM2) THEN
EXEC SQL EXECUTE BUSNOMBRE6 USING (IDAPPAT, IDAPMAT, IDNOM1, IDNOM2, IDNOMBRE);
END IF
RETURN ROW;
ELSE
EXEC SQL EXECUTE BUSNOMBRE2 INTO (IDNOMBRE);
EXEC SQL FETCH BUSNOMBRE2;
IF IDNOMBRE IS NULL THEN
IDNOMBRE := 0;
END IF
IDNOMBRE := IDNOMBRE + 1;
EXEC SQL EXECUTE BUSNOMBRE3 USING (IDNOMBRE, IDAPPAT, IDAPMAT, IDNOM1, IDNOM2, NOMCOMP_Z);
RETURN ROW;
END IF
EXEC SQL DROP BUSNOMBRE1;
EXEC SQL DROP BUSNOMBRE2;
EXEC SQL DROP BUSNOMBRE3;
EXEC SQL DROP BUSNOMBRE4;
EXEC SQL DROP BUSNOMBRE5;
EXEC SQL DROP BUSNOMBRE6;
EXEC SQL DROP BUSNOMBRE7;
EXEC SQL DROP BUSNOMBRE8;
END ";
drop PROCEDURE AGREGA_VND; commit work;
"CREATE PROCEDURE AGREGA_VND(codigo_z varchar(4), appat_z varchar(50), APMAT_Z VARCHAR(50), NOMPIL1_Z VARCHAR(50), NOMPIL2_Z VARCHAR(50) )
RETURNS ( IDNOMBRE_Z INTEGER, idvnd_z integer, nombre_z varchar(250))
BEGIN
EXEC SQL PREPARE BUS_VEND SELECT IDVND, idNOMBRE FROM VENDEDOR WHERE codigo=?;
EXEC SQL PREPARE BUS_NOM CALL BUSNOMBRE (?, ?, ?, ?);
exec sql prepare ins_vend insert into vendedor (codigo,nombre,idvnd,idnombre) values (?,?,?,?);
exec sql prepare bus_sigidvnd select max(idvnd) from vendedor where idvnd > 0;
NOMbre_Z := RTRIM( RTRIM(RTRIM(APPAT_Z + ' ' + APMAT_Z) + ' ' + NOMPIL1_Z) + ' ' + NOMPIL2_Z);
EXEC SQL EXECUTE BUS_VEND using( codigo_z) INTO (IDVND_Z, idNOMBRE_Z);
EXEC SQL FETCH BUS_VEND;
if SQLSUCCESS <> 1 then
exec sql execute bus_sigidvnd into (idvnd_z);
exec sql fetch bus_sigidvnd;
if idvnd_z is null then
idvnd_z := 0;
end if
idvnd_z := idvnd_z + 1;
EXEC SQL EXECUTE BUS_NOM USING (APPAT_Z, APMAT_Z, NOMPIL1_Z, NOMPIL2_Z) INTO (IDNOMBRE_Z);
EXEC SQL FETCH BUS_NOM;
EXEC SQL EXECUTE ins_VEND USING (codigo_z, nombre_z, IDVND_Z, IDNOMBRE_Z);
end if
RETURN ROW;
EXEC SQL DROP BUS_VEND;
EXEC SQL DROP BUS_NOM;
EXEC SQL DROP ins_VEND;
EXEC SQL DROP bus_sigidvnd;
END";
commit work;
call AGREGA_VND('MDL', 'MAY', 'DZUL', 'LINA', 'TRINIDAD');
commit work;
Cualquier ayuda será bienvenida.
Gracias |