MyCur%FOUND
會傳回TRUE或FALSE,來指示最近的擷取是否成功。其一般格式為:
指標變數名稱%屬性名稱 (cousor_name%ATTRIBUTE_NAME)
屬性 資料類型 意義 建議使用時機
cursor_name%FOUND BOOLEAN 若於最近一次的擷取,
找到表格中的資料列,
則為true;否則就是false。 在開啟游標並從中擷取資料之後,
但在關閉游標之前(在第一次擷取之前會是null)。
cursor_name%NOTFOUND BOOLEAN 在邏輯上,恰為%FOUND的反義。 同上。
cursor_name%ROWCOUNT NUMBER 目前擷取過的資料列數。 同上(但在第一次擷取之前會是0。
cursor_name%ISOPEN BOOLEAN 依據cursor_name是否已開啟,
而傳回TRUCE或FALSE。
cursor_name%BULK_ROWCOUNT 與陣列類似的資料結構它提供了
以FORALL敘述來執行之大量DML操作
所影響到的ROWCOUNT列表。
cursor_name%BULK_EXCEPTIONS 與陣列類似的資料結構,
它提供了以FORALL敘述
執行之大量DML操作所傳回的例外列表
範例:
把莎士比亞的書全部抓出來顯示。
DECLARE
i_title varchar2(200);
i_date DATE;
CURSOR bcur /*指標*/
IS SELECT title,date_published FROM book
Where author LIKE 'SHAKESPEARE%';
BEGIN
OPEN bcur; /*開啟*/
LOOP
FETCH bcur INTO i_title,i_date; /*從cusor中擷取資料給兩個變數*/
EXIT WHEN bcur%NOTFOUND; /*如果沒資料跳出*/
DBMS_OUTPUT.PUT_LINE('序號' || bcur%ROWCOUNT || ' 書名:' || i_title || ' 出版日:' || i_date); /*印出資料*/
END LOOP;
CLOSE bcur;
END;
/
===============================================================
記錄資料結構,把取出的資料包成一個物件來用。
cusor_name%ROWTYPE:一筆資料的集合,好處是不用使用那麼多變數作擷取(FETCH)
範例:
把莎士比亞的書全部抓出來顯示。
DECLARE
i_title varchar2(200);
i_date DATE;
CURSOR bcur /*指標*/
IS SELECT title,date_published FROM book
Where author LIKE 'SHAKESPEARE%';
b_record bcur%ROWTYPE; /*設定b_record為記錄類型(record type)*/
BEGIN
OPEN bcur; /*開啟*/
LOOP
FETCH bcur INTO b_record; /*指派一整筆資料給b_record*/
EXIT WHEN bcur%NOTFOUND; /*如果沒資料跳出*/
DBMS_OUTPUT.PUT_LINE('序號' || bcur%ROWCOUNT || ' 書名:' || b_record.title || ' 出版日:' || b_record.date); /*印出資料,使用books欄位名*/
END LOOP;
CLOSE bcur;
END;
/
-----------------------------------------------------------
/*DECLARE
abc varchar(240);
def varchar(240) := '1000';
BEGIN
SELECT segment1 INTO abc FROM MTL_SYSTEM_ITEMS_B WHERE segment1='SHP001' and organization_id = '85';
IF abc = 'SHP001' THEN
dbms_output.put_line(abc);
ELSE
dbms_output.put_line(def);
END IF;
END;*/
--DECLARE
-- abc varchar(240);
--def number := 1;
--BEGIN
-- SELECT segment1 INTO abc FROM MTL_SYSTEM_ITEMS_B WHERE segment1='SHP001' and organization_id = '85';
--LOOP
-- dbms_output.put_line(abc);
-- def := def+1;
--EXIT WHEN def > 3;
--END LOOP;
/*IF abc = 'SHP001' THEN
dbms_output.put_line(abc);
ELSE
dbms_output.put_line(def);
END IF;*/
--END;
----------------------------------------------------------------------------------------
DECLARE
--var_rows number(5);
abc varchar(240);
def varchar(240);
cursor c1 is SELECT segment1, description FROM MTL_SYSTEM_ITEMS_B WHERE segment1='SHP001';
c1_record c1%ROWTYPE;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO c1_record;
EXIT WHEN c1%NOTFOUND;
--var_rows := SQL%ROWCOUNT;
dbms_output.put_line(c1_record.segment1||c1_record.description||' None of the salaries where updated');
--total_val := total_val + employee_rec.monthly_income;
END LOOP;
CLOSE c1;
--SELECT segment1 into abc FROM MTL_SYSTEM_ITEMS_B WHERE segment1='SHP001' and organization_id = '85';
--IF SQL%NOTFOUND THEN
--var_rows := SQL%ROWCOUNT;
--dbms_output.put_line(var_rows||'None of the salaries where updated');
/*ELSIF SQL%FOUND THEN
var_rows := SQL%ROWCOUNT;
dbms_output.put_line('Salaries for ' || var_rows || ' employees are updated');*/
--END IF;
END;
------------------------------------------------------------
SQL> DECLARE
2 CURSOR c1 IS SELECT last_name, job_id FROM employees
3 WHERE job_id LIKE '%CLERK%' AND manager_id > 120;
4 BEGIN
5 FOR item IN c1
6 LOOP
7 DBMS_OUTPUT.PUT_LINE
8 ('Name = ' || item.last_name || ', Job = ' || item.job_id);
9 END LOOP;
10 END;
11 /
Name = OConnell, Job = SH_CLERK
Name = Grant, Job = SH_CLERK
Name = Bissot, Job = ST_CLERK
沒有留言:
發佈留言