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

          游標(biāo):

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


          分類:

          靜態(tài)游標(biāo):
          分為顯式游標(biāo)和隱式游標(biāo)。

          REF游標(biāo):
          是一種引用類型,類似于指針。

          顯式游標(biāo):

           CURSOR 游標(biāo)名 ( 參數(shù) ) [返回值類型] IS
            Select 語句


          生命周期:

          1.打開游標(biāo)(OPEN)
          解析,綁定。。。不會從數(shù)據(jù)庫檢索數(shù)據(jù)

          2.從游標(biāo)中獲取記錄(FETCH INTO)
          執(zhí)行查詢,返回結(jié)果集。通常定義局域變量作為從游標(biāo)獲取數(shù)據(jù)的緩沖區(qū)。

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


          選項:參數(shù)和返回類型


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

          隱式游標(biāo):

          不用明確建立游標(biāo)變量,分兩種:
          1.在PL/SQL中使用DML語言,使用ORACLE提供的名為SQL的隱示游標(biāo)
          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
          舉例:

          單獨(dú)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獲取值,只能返回一行。

          游標(biāo)屬性:

          %FOUND:變量最后從游標(biāo)中獲取記錄的時候,在結(jié)果集中找到了記錄。
          %NOTFOUND:變量最后從游標(biāo)中獲取記錄的時候,在結(jié)果集中沒有找到記錄。
          %ROWCOUNT:當(dāng)前時刻已經(jīng)從游標(biāo)中獲取的記錄數(shù)量。
          %ISOPEN:是否打開。

          隱式游標(biāo):
          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; 

          顯式和隱式游標(biāo)的區(qū)別:

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

          REF CURSOR游標(biāo):

          動態(tài)游標(biāo),在運(yùn)行的時候才能確定游標(biāo)使用的查詢。分類:
          強(qiáng)類型(限制)REF CURSOR,規(guī)定返回類型
          弱類型(非限制)REF CURSOR,不規(guī)定返回類型,可以獲取任何結(jié)果集。


          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;


          強(qiáng)類型舉例:

          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游標(biāo)的變量
           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 譚明 閱讀(603) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 宣恩县| 虹口区| 专栏| 报价| 吉水县| 维西| 吉木乃县| 台安县| 桦南县| 普宁市| 安化县| 赣州市| 临安市| 城步| 富源县| 漯河市| 太和县| 宝山区| 隆林| 莱州市| 娱乐| 怀远县| 堆龙德庆县| 临桂县| 手游| 凭祥市| 阿城市| 宝兴县| 旬阳县| 土默特右旗| 余庆县| 花莲市| 平凉市| 佛教| 井陉县| 霍城县| 桂平市| 湖南省| 武夷山市| 灌云县| 文安县|