BASES DE DATOS ORACLE

http://www.redcientifica.com/oracle/


Administración y Optimización de Bases de Datos Oracle
Copyright 1999-2004 Manuel de la Herrán Gascón

Cursor vs Select

Creación de objetos

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);

Solución 1

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;

Solución 2 (Errónea)

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;
/

Solución 3

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/


Enviar un e-mail a Manuel de la Herrán Gascón Buzón de contacto
© 1999-2004 Manuel de la Herrán Gascón
Volver a la página anteriorIr a la página principalIr a la página siguiente3/5