<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-28  評論-15  文章-81  trackbacks-0
     

    游標:

    用來查詢數據庫,獲取記錄集合(結果集)的指針,可以讓開發者一次訪問一行結果集,在每條結果集上作操作。


    分類:

    靜態游標:
    分為顯式游標和隱式游標。

    REF游標:
    是一種引用類型,類似于指針。

    顯式游標:

     CURSOR 游標名 ( 參數 ) [返回值類型] IS
      Select 語句


    生命周期:

    1.打開游標(OPEN)
    解析,綁定。。。不會從數據庫檢索數據

    2.從游標中獲取記錄(FETCH INTO)
    執行查詢,返回結果集。通常定義局域變量作為從游標獲取數據的緩沖區。

    3.關閉游標(CLOSE)
    完成游標處理,用戶不能從游標中獲取行。還可以重新打開。


    選項:參數和返回類型


    (1).
    declare
     cursor emp_cur ( p_deptid in number) is
    select * from employees where department_id = p_deptid;

    l_emp employees%rowtype;
    begin
     dbms_output.put_line('Getting employees from department 30');
    open emp_cur(30);
     loop
      fetch emp_cur into l_emp;
      exit when emp_cur%notfound;
      dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
      dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
     end loop;
     close emp_cur;

     dbms_output.put_line('Getting employees from department 90');
    open emp_cur(90);
     loop
      fetch emp_cur into l_emp;
      exit when emp_cur%notfound;
      dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
      dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
     end loop;
     close emp_cur;
    end;
    (2).

    declare

     CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME FROM DEPT;

     W_ID NUMBER;

     W_NAME VARCHAR2(240);

    begin

     OPEN DEPT_CR;

     LOOP

        FETCH DEPT_CR INTO W_ID,W_NAME;

        EXIT WHEN DEPT_CR%NOTFOUND;

        DBMS_OUTPUT.put_line(W_ID||' '||W_NAME);

     END LOOP;

     CLOSE DEPT_CR;

    end;

    (3).

    declare

     CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME FROM DEPT;

     DEPT_REC DEPT_CR%ROWTYPE;

    begin

     OPEN DEPT_CR;

     LOOP

        FETCH DEPT_CR INTO DEPT_REC;

        EXIT WHEN DEPT_CR%NOTFOUND;

        DBMS_OUTPUT.put_line(DEPT_REC.DEPT_ID);

     END LOOP;

     CLOSE DEPT_CR;

    end;

    隱式游標:

    不用明確建立游標變量,分兩種:
    1.在PL/SQL中使用DML語言,使用ORACLE提供的名為SQL的隱示游標
    2.CURSOR FOR LOOP,用于for loop 語句


    1
    舉例:

    declare
    begin
     update departments set department_name=department_name;
     --where 1=2; 
     dbms_output.put_line('update '|| sql%rowcount ||' records');
    end;


    2
    舉例:

    declare
    begin
     for my_dept_rec in ( select department_name, department_id from departments)
     loop
      dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name);
     end loop;
    end;


    3
    舉例:

    單獨select

    declare
     l_empno emp.EMPLOYEE_ID%type;
    -- l_ename emp.ename%type;
    begin
     select EMPLOYEE_ID   
      into l_empno
     from emp;
     --where rownum =1;
     dbms_output.put_line(l_empno);
    end;

    使用INTO獲取值,只能返回一行。

    游標屬性:

    %FOUND:變量最后從游標中獲取記錄的時候,在結果集中找到了記錄。
    %NOTFOUND:變量最后從游標中獲取記錄的時候,在結果集中沒有找到記錄。
    %ROWCOUNT:當前時刻已經從游標中獲取的記錄數量。
    %ISOPEN:是否打開。

    隱式游標:
    declare

     CURSOR DEPT_CR IS SELECT DEPT_ID,DEPT_NAME FROM DEPT;

    begin

     FOR DEPT_REC IN DEPT_CR

     LOOP

        DBMS_OUTPUT.put_line(DEPT_REC.DEPT_ID||'   '||DEPT_REC.DEPT_NAME);

     END LOOP;

    end; 

    顯式和隱式游標的區別:

    盡量使用隱式游標,避免編寫附加的游標控制代碼(聲明,打開,獲取,關閉),也不需要聲明變量來保存從游標中獲取的數據。

    REF CURSOR游標:

    動態游標,在運行的時候才能確定游標使用的查詢。分類:
    強類型(限制)REF CURSOR,規定返回類型
    弱類型(非限制)REF CURSOR,不規定返回類型,可以獲取任何結果集。


    TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]


    Declare
     Type refcur_t is ref cursor;
     
     Type emp_refcur_t is ref cursor return employee%rowtype;
    Begin
     Null;
    End;
    舉例:

    declare

     TYPE TY_DEPTREFCUR IS REF CURSOR;

     CR_DEPT     TY_DEPTREFCUR;

     REC_DEPT    DEPT%ROWTYPE;

    begin

     OPEN CR_DEPT FOR

        SELECT * FROM DEPT;

     LOOP

     FETCH CR_DEPT INTO REC_DEPT;

     EXIT WHEN CR_DEPT%NOTFOUND;

     DBMS_OUTPUT.put_line(REC_DEPT.DEPT_ID||' '||REC_DEPT.DEPT_NAME);

     END LOOP;

     CLOSE CR_DEPT;

    end;


    強類型舉例:

    declare
     --
    聲明記錄類型
     type emp_job_rec is record(
      employee_id number,
      employee_name varchar2(50),
      job_title varchar2(30)
     );
     --聲明REF CURSOR,返回值為該記錄類型
     type emp_job_refcur_type is ref cursor
      return emp_job_rec;
     --定義REF CURSOR游標的變量
     emp_refcur emp_job_refcur_type;

     emp_job emp_job_rec;
    begin
     open emp_refcur for
      select e.employee_id,
        e.first_name || ' ' ||e.last_name "employee_name",
        j.job_title
      from employees e, jobs j
      where e.job_id = j.job_id and rownum < 11 order by 1;

     fetch emp_refcur into emp_job;
     while emp_refcur%found loop
      dbms_output.put_line(emp_job.employee_name || '''s job is ');
      dbms_output.put_line(emp_job.job_title);
      fetch emp_refcur into emp_job;
     end loop;
    end;

    posted on 2008-06-05 10:51 譚明 閱讀(601) 評論(0)  編輯  收藏 所屬分類: Oracle
    主站蜘蛛池模板: 国产免费一区二区三区免费视频 | 久久精品国产亚洲沈樵| 亚洲av女电影网| 亚洲AV一二三区成人影片| 男男gvh肉在线观看免费| 久久国产高潮流白浆免费观看| 午夜神器成在线人成在线人免费 | 在线观看视频免费完整版| 亚洲男女内射在线播放| 久久亚洲国产成人影院| 大地资源在线资源免费观看| 青青草国产免费久久久下载| 亚洲一区二区电影| 日韩大片免费观看视频播放 | 亚洲精品乱码久久久久蜜桃| 国产麻豆成人传媒免费观看| 一本久到久久亚洲综合| 亚洲中文字幕无码av| aⅴ在线免费观看| 怡红院亚洲怡红院首页| 亚洲精品伦理熟女国产一区二区| 国产无遮挡又黄又爽免费视频| 亚洲经典在线观看| 国产亚洲精品免费视频播放| 免费播放春色aⅴ视频| 亚洲 日韩经典 中文字幕| 国产女高清在线看免费观看| 又硬又粗又长又爽免费看 | 精品在线免费视频| 最近2019中文字幕免费直播 | 日韩毛片一区视频免费| 亚洲精品无码AV中文字幕电影网站 | 一级做a爰片性色毛片免费网站| 亚洲国产精品无码久久久蜜芽 | 久久精品视频免费| 亚洲乱码一二三四五六区| 日韩精品内射视频免费观看| 亚洲国产精品激情在线观看| 黄页网站在线观看免费| 亚洲AV综合色区无码一区| 日韩精品在线免费观看|