Administración y Optimización de Bases de Datos Oracle
Copyright 1999-2004
Manuel de la Herrán Gascón
Cursor vs Select
CREATE TABLE CLTE (
CodClte number,
Nom varchar2(50),
Edad number
);
CREATE TABLE CREDITO (
CodClte number,
Importe number
);
CREATE TABLE DENEGAR (
CodClte number,
Nom varchar2(50)
);
DELETE FROM CLTE;
DELETE FROM CREDITO;
DELETE FROM DENEGAR;
INSERT INTO CLTE VALUES (1,'Pepe',30);
INSERT INTO CLTE VALUES (2,'Luis',27);
INSERT INTO CLTE VALUES (3,'Dani',14);
INSERT INTO CLTE VALUES (4,'Rosa',19);
INSERT INTO CLTE VALUES (5,'Bego',18);
INSERT INTO CLTE VALUES (6,'Manu',28);
INSERT INTO CLTE VALUES (7,'Paco',54);
INSERT INTO CREDITO VALUES (1,5000000);
INSERT INTO CREDITO VALUES (2,100000);
INSERT INTO CREDITO VALUES (3,4300000);
INSERT INTO CREDITO VALUES (5,2000000);
INSERT INTO CREDITO VALUES (7,500000);
INSERT INTO DENEGAR(
SELECT
CLTE.CodClte,
CLTE.Nom
FROM CLTE, CREDITO WHERE
CLTE.CodClte = CREDITO.CodClte AND
CREDITO.Importe > 1000000 AND
CLTE.Edad <= 25
);
SELECT * FROM DENEGAR;
CREATE OR REPLACE PROCEDURE cargarDenegar IS
CURSOR cClte IS SELECT CodClte, Nom, Edad FROM CLTE;
CURSOR cCredito IS SELECT CodClte, Importe FROM CREDITO;
regClte cClte%ROWTYPE;
vCreditoCodClte CREDITO.CodClte%TYPE;
vCreditoImporte CREDITO.Importe%TYPE;
BEGIN
OPEN cClte;
OPEN cCredito;
loop
fetch cClte into regClte;
fetch cCredito into vCreditoCodClte, vCreditoImporte;
exit when cClte%NOTFOUND OR cCredito%NOTFOUND;
if
regClte.CodClte = vCreditoCodClte AND
regClte.Edad <25 AND
vCreditoImporte > 1000000
then
INSERT INTO DENEGAR VALUES(regClte.CodClte, regClte.Nom);
end if;
end loop;
CLOSE cClte;
CLOSE cCredito;
END;
/
CREATE OR REPLACE PROCEDURE cargarDenegar IS
CURSOR cClte IS SELECT CodClte, Nom, Edad FROM CLTE;
CURSOR cCredito IS SELECT CodClte, Importe FROM CREDITO;
regClte cClte%ROWTYPE;
regCredito cCredito%ROWTYPE;
BEGIN
COMMIT;
OPEN cClte;
OPEN cCredito;
fetch cClte into regClte;
fetch cCredito into regCredito;
loop
exit when cClte%NOTFOUND OR cCredito%NOTFOUND;
--tratar registro actual
if
regClte.CodClte = regCredito.CodClte AND
regClte.Edad <25 AND
regCredito.Importe > 1000000
then
INSERT INTO DENEGAR VALUES(regClte.CodClte, regClte.Nom);
end if;
--pasar al siguiente
if regClte.CodClte = regCredito.CodClte then
fetch cClte into regClte;
fetch cCredito into regCredito;
elsif regClte.CodClte < regCredito.CodClte then
fetch cClte into regClte;
else
dbms_output.put_line('Error A0001. El cliente ' || regClte.CodClte || ' no existe en la posición esperada en CLTE o el cliente ' || regCredito.CodClte || ' no existe en la posición esperada en CREDITO');
ROLLBACK;
end if;
end loop;
CLOSE cClte;
CLOSE cCredito;
END;
/
SET SERVEROUTPUT ON
EXEC cargarDenegar;
SELECT * FROM DENEGAR;
Este curso esta incluido en el CD-ROM de REDcientífica. Solicítalo por correo haciendo click aquí. http://www.redcientifica.com/cdrom/
|