Pl/Sql De Explycyt Cursors Tanymlaması Nasıl Yapılır


Kod:
EXPLICIT CURSORS

TANIMLAMASI(DECLARED) VE İSİMLENDİRİLMESİ(NAMED) PROGRAMCI TARFINDAN YAPILAN CURSOR LARDIR.
SORGULAMA SONUCUNDA BİRDEN FAZLA SATIR DÖNER. CURSOR ÖZEL İFADELERLE YÖNLENDİRİLEBİLİR.

SYNTAX :
CURSOR CURSOR_NAME IS SELECT_STATEMENT;
CURSOR_NAME: PL/SQL IDENTIFIER.
SELECT_STATEMENT: SELECT İFADESİ. SELECT İFADESİ İÇERİSİNDE INTO KULLANILMAMALIDIR.
GEREKLİ OLDUĞU DURUMLARDA ORDER BY İFADESİ KULLANILABİLİR.

CURSOR TANIMLAMASINDA YAZILAN SELECT İFADESİ(SELECT_STATEMENT) SONUCUNDA DÖNEN SATIRLARLA BİR ACTIVE SET OLUŞUR.

DECLARE CURSOR TANIMLAMASINI YAPABİLECEĞİMİZ KISIMDIR.
BU KISIMDA, BİZİM TARAFIMIZDAN İSİMLENDİRİLMİŞ BİR SQL ALANI OLUŞTURUYORUZ.

OPEN AKTİF SET OLUŞTURULUR. (... SELECT * FROM EMP; SORGUSUYLA EMP TABLOSUNUN İÇERİSİNDE YER ALAN BÜTÜN KAYITLARLA YA DA SATIRLARLA BİR AKTİF SET OLUŞTURULUR.)

FETCH OLUŞTURULAN AKTİF SET TEKİ, CURSOR IN İŞARET ETTİĞİ(CURRENT ROW) SATIRDAKİ DEĞERLERİ, TANIMLANAN DEĞİŞKENLERE ATAR.
AKTİF SET TE BİR SONRAKİ SATIRIN OLUP OLMADIĞINI KONTROL EDER. BİR SONRAKİ SATIR VARSA FETCH E GERİ DÖNER.
BİR SONRAKİ SATIR YOKSA HATA MESAJI VERMEZ.

CLOSE AKTİF SETİ BOŞALTIR.

ÖRNEK1:

*********************** DECLARE

DECLARE
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME FROM EMP;
CURSOR DEPT_CURSOR IS SELECT * FROM DEPT WHERE DEPTNO=10;
BEGIN
...
END;

YA DA
DECLARE
VAR_EMPNO EMP.EMPNO%TYPE; VARIABLE(DEĞİŞKEN) TANIMLAMASI, CURSOR İFADESİNDEN ÖNCE YAPILMALIDIR.
VAR_ENAME EMP.ENAME%TYPE;
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME FROM EMP;
BEGIN
...
END;

*********************** OPEN

SYNTAX
OPEN CURSOR_NAME;

*********************** FETCH

SYNTAX
FETCH CURSOR_NAME INTO [DEĞİŞKEN1, DEĞİŞKEN2, ...| RECORD_NAME];
EĞER DECLARE KISMINDA DEĞİŞKEN TANIMLARKEN, %TYPE DEĞİLDE %ROWTYPE KULLANIRSA
(VAR_EMP EMP%ROWTYPE; ŞEKLİNDE), RECORD_NAME İ KULLANABİLİRİZ.
BURADA DİKKAT EDİLMESİ GEREKEN CURSOR IN İŞARET ETTİĞİ SATIRDA
YER ALAN ALANLARIN(... SELECT EMPNO,ENAME İFADESİNDEKİ EMPNO VE ENAME) DOĞRU DEĞİŞKENLERE ATANMASIDIR.
DEĞİŞKENLERİN SAYISINA VE SIRASINADA DİKKAT EDİLMELİDİR.
FETCH EMP_CURSOR INTO VAR_EMPNO,VAR_ENAME;

ÖRNEK2:
DECLARE
VAR_EMPNO EMP.EMPNO%TYPE;
VAR_ENAME EMP.ENAME%TYPE;
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME FROM EMP;
BEGIN
OPEN EMP_CURSOR;
FOR I IN 1..5 LOOP
FETCH EMP_CURSOR INTO VAR_EMPNO,VAR_ENAME;
END LOOP
END;

*********************** CLOSE

SYNTAX
CLOSE CURSOR_NAME;

ÖRNEK3:
SET SERVEROUTPUT ON
DECLARE
VAR_EMPNO EMP.EMPNO%TYPE;
VAR_ENAME EMP.ENAME%TYPE;
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME FROM EMP;
BEGIN
OPEN EMP_CURSOR;
FOR I IN 1..5 LOOP
FETCH EMP_CURSOR INTO VAR_EMPNO,VAR_ENAME;
DBMS_OUTPUT.PUT_LINE('EMP NO :'||VAR_EMPNO);
DBMS_OUTPUT.PUT_LINE('EMP NAME :'||VAR_ENAME);
DBMS_OUTPUT.PUT_LINE('********************');
END LOOP;
CLOSE EMP_CURSOR;
END;