網頁

2011年3月2日星期三

PL/SQL 游標屬性(cursor attriute)

PL/SQL 以游標屬性(cursor attribute),對與游標有關的一些極有用資訊,提供了存取方法。預先定義的游標特性有好機個,PL/SQL是以百分比符號後面接著屬性名稱,來指出那些特性。在程式碼中,可將屬性當作變數來參照。例如:

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

沒有留言:

發佈留言