blogjava's web log

          blogjava's web log
          ...

          oracle游標(biāo)備忘

          -- 例六:%NotFound

          BEGIN
          ??
          DELETE ? FROM ?Rs_Employees
          ????
          Where ?HeTongId = ' WL-090001 ' ;
          ??
          ??
          if ?sql % Notfound? then
          ????Dbms_Output.put_line(
          ' 沒有找到要刪除的記錄 ' );
          ??
          else
          ????Dbms_Output.put_line(
          ' 已刪除記錄 ' );
          ??
          end ? if ;

          END ;
          ???
          ???
          ???
          -- 例七:%RowCount,查詢記錄行數(shù)
          Declare
          ??v_name?Rs_Employees.Name
          % type;
          BEGIN
          ??
          SELECT ?Name? Into ?v_Name
          ????
          FROM ?Rs_Employees
          ????
          Where ?HeTongId = ' WL-090010 ' ;
          ??
          ??
          if ?sql % RowCount ? > 0 ? Then
          ????Dbms_Output.put_line(
          ' 已從表中選擇行,Name為: ' || v_Name);
          ??
          else
          ????Dbms_Output.put_line(
          ' 從表中未選擇行 ' );
          ??
          end ? if ;

          END ;
          ???
          -- 再演示以下代碼
          BEGIN
          ??
          DELETE ? FROM ?Rs_Employees
          ????
          Where ?HeTongId <= ' WL-090010 ' ;
          ??
          ??Dbms_Output.put_line(
          ' 已從表中刪除 ' || To_Char(sql % RowCount ) || ' 條記錄 ' );
          END ;???
          ???
          ?
          ?
          -- 例八:顯式游標(biāo)
          --
          以下示例在所有游標(biāo)的記錄中的Name字段中加一字串
          --
          同時在此示范了如何使用%NotFound屬性
          --
          set?serveroutput?on;
          Declare
          ??v_Id????Rs_Employees.Hetongid
          % type;
          ??v_name??Rs_Employees.Name
          % type;
          ??v_Count?
          Number : = 0 ;
          ??
          ??
          Cursor ?MyCur? Is
          ????
          SELECT ?HetongId,Name? FROM ?Rs_Employees
          ??????
          Where ?HeTongId <= ' WL-090010 ' ;
          ??????
          BEGIN
          ??
          -- 打開游標(biāo)?
          ?? Open ?MyCur;
          ??
          -- 進(jìn)入循環(huán)
          ??Loop
          ????
          Fetch ?MyCur? Into ?v_id,v_name;
          ????
          Exit ? When ?MyCur % NotFound;
          ????
          ????
          Update ?Rs_Employees
          ??????
          Set ?Name? = ?Name? || ? ' X '
          ??????
          Where ?HeTongId = v_Id;
          ????v_Count?:
          = ?v_Count? + ? 1 ;
          ??
          End ?Loop;
          ??
          ??Dbms_Output.put_line(
          ' 已更新 ' || v_Count || ' ' );
          END ;

          -- 例10:以下示范%RowCount和%IsOpen,同時示范了%RowType的使用
          --
          例10:以下示例%RowCount
          Declare
          ??v_Row???Rs_Employees
          % RowType;
          ?
          ??
          Cursor ?MyCur? Is
          ????
          SELECT ? * ? FROM ?Rs_Employees
          ??????
          Where ?HeTongId <= ' WL-090010 ' ;
          BEGIN
          ??
          if ? Not ?MyCur % IsOpen? then
          ????Dbms_Output.put_line(
          ' 游標(biāo)未打開 ' );
          ????
          -- 打開游標(biāo)?
          ???? Open ?MyCur;
          ??
          end ? if ;

          ??
          -- 進(jìn)入循環(huán)
          ??Loop
          ????
          Fetch ?MyCur? Into ?v_row;
          ????
          Exit ? When ?MyCur % NotFound;
          ??
          ????Dbms_Output.put_line(
          ' 當(dāng)前已取得 ' || MyCur % RowCount || ' ' );
          ????Dbms_Output.put_line(
          ' 姓名: ' || v_row.Name || ' ???? ' || ' 合同號: ' || v_row.HeTongId);
          ????Dbms_Output.put_line(
          '' );
          ??
          End ?Loop;
          ??
          ??Dbms_Output.put_line(
          ' 總共已取得 ' || MyCur % RowCount || ' ' );
          ??
          ??
          if ?MyCur % IsOpen? then
          ????Dbms_Output.put_line(
          ' 游標(biāo)已打開 ' );
          ????
          Close ?MyCur;
          ??
          end ? if ;

          ??
          if ? Not ?MyCur % IsOpen? then
          ????Dbms_Output.put_line(
          ' 游標(biāo)已關(guān)閉 ' );
          ??
          end ? if ;
          ??
          END ;

          -- 例12:查詢嵌套表中數(shù)據(jù)的游標(biāo)
          --
          1?創(chuàng)建類型
          ?? CREATE ? OR ? REPLACE ?TYPE?emp_type? As ?Object?
          ???(eno???
          number ,
          ????ename?
          varchar2 ( 20 ),
          ????esal??
          number );
          -- 2?使用Table?of?子句創(chuàng)建Table類型
          ?? CREATE ?TYPE?emp_nt? AS ? Table ? Of ?emp_type;
          -- 3?使用emp_nt數(shù)據(jù)類型創(chuàng)建myemp表
          ?? CREATE ? TABLE ?myemp
          ???(deptno?????
          number ,
          ????edet???????emp_nt)
          ????NESTED?
          TABLE ?edet?Store? As ?myemployee;
          -- 4?初始化myemp的數(shù)據(jù)
          ?? Insert ? Into ?myemp? values
          ????(
          10 ,emp_nt(emp_type( 1000 , ' James ' ,? 10000 ),
          ???????????????emp_type(
          1001 , ' Daniel ' , 20000 )));
          ??
          Commit ;
          ??
          -- 執(zhí)行下列代碼??
          Declare
          ??sal??
          number ;
          ??ena??
          varchar2 ( 20 );
          ??
          ??
          Cursor ?MyCur? Is
          ????
          SELECT ?a.esal,a.ename
          ??????
          FROM ?the?
          ??????(
          Select ?edet? From ?myemp
          ?????????
          Where ?deptno = 10 )?a;
          BEGIN
          ??
          -- 打開游標(biāo)?
          ?? Open ?MyCur;
          ??
          -- 進(jìn)入循環(huán)
          ??Loop
          ????
          Fetch ?MyCur? Into ?sal,ena;
          ????
          Exit ? When ?MyCur % NotFound;
          ????Dbms_Output.put_line(ena
          || ' ???? ' || sal);
          ??
          End ?Loop;
          ??
          ??
          Close ?MyCur;
          END ;




          -- 例13:此例改自例10,示范循環(huán)游標(biāo)的用法
          Declare
          ??
          Cursor ?MyCur? Is
          ????
          SELECT ? * ? FROM ?Rs_Employees
          ??????
          Where ?HeTongId <= ' WL-090010 ' ;
          BEGIN

          ??
          For ?tmp_cur? In ?MyCur
          ??Loop
          ????Dbms_Output.put_line(
          ' 當(dāng)前已取得 ' || MyCur % RowCount || ' ' );
          ????Dbms_Output.put_line(
          ' 姓名: ' || tmp_cur.Name || ' ???? ' || ' 合同號: ' || tmp_cur.HeTongId);
          ??
          End ?Loop;

          ??
          -- 在這種情況下,下面這條語句不能執(zhí)行
          ?? -- Dbms_Output.put_line('當(dāng)前已取得'||MyCur%RowCount||'行');
          END ;


          -- 再示范帶參數(shù)的游標(biāo)
          Declare
          ??
          Cursor ?MyCur(m_HeTongId?Rs_Employees.Hetongid % type)? Is
          ????
          SELECT ? * ? FROM ?Rs_Employees
          ??????
          Where ?HeTongId <= m_HeTongId;
          BEGIN

          ??
          For ?tmp_cur? In ?MyCur( ' WL-090020 ' )
          ??Loop
          ????Dbms_Output.put_line(
          ' 當(dāng)前已取得 ' || MyCur % RowCount || ' ' );
          ????Dbms_Output.put_line(
          ' 姓名: ' || tmp_cur.Name || ' ???? ' || ' 合同號: ' || tmp_cur.HeTongId);
          ??
          End ?Loop;

          ??
          -- 在這種情況下,下面這條語句不能執(zhí)行
          ?? -- Dbms_Output.put_line('當(dāng)前已取得'||MyCur%RowCount||'行');
          END ;


          -- 再示范以下寫法
          --
          在循環(huán)游標(biāo)中使用查詢
          Declare
          ??v_HeTongId??Rs_Employees.Hetongid
          % type;
          BEGIN
          ??v_HeTongId?:
          = ? ' WL-090020 ' ;
          ??
          ??
          For ?tmp_cur? In ?( SELECT ? * ? FROM ?Rs_Employees
          ????????????????????
          Where ?HeTongId <= v_HeTongId)
          ??Loop
          ????Dbms_Output.put_line(
          ' 姓名: ' || tmp_cur.Name || ' ???? ' || ' 合同號: ' || tmp_cur.HeTongId);
          ??
          End ?Loop;
          END ;





          -- 例15:示范游標(biāo)變量
          --
          此例要在Command?window或Sql?Plus中示范,結(jié)果會有點(diǎn)區(qū)別
          --
          SET?SERVEROUTPUT?ON;
          Declare
          ??TYPE?r1_cur?
          IS ?REF? CURSOR ;
          ??var1?r1_cur;
          ??no?????
          varchar2 ( 20 );
          ??
          ??v_czy??sc_chukudan.czy
          % type;
          ??v_pid??sc_chukudanDetail.Productid
          % type;
          ??
          BEGIN
          ??no?:
          = ? ' &你選擇的 ' ;

          ??
          IF ? UPPER (no)? = ? ' MASTER ' ? then
          ????
          OPEN ?var1? For
          ??????
          Select ?Czy? FROM ?sc_chukudan
          ????????
          Where ?ChuKuDanId? = ? ' SCKD04020001 ' ;
          ????
          FETCH ?var1? into ?v_Czy;
          ????Dbms_Output.put_line(
          ' 操作員是: ' || v_czy);
          ????
          CLOSE ?var1;
          ??
          ELSE
          ????
          OPEN ?var1? For
          ??????
          Select ?Productid? FROM ?sc_chukudanDetail
          ????????
          Where ?ChuKuDanId? = ? ' SCKD04020001 ' ;
          ????LOOP
          ??????
          FETCH ?var1? into ?v_pid;
          ??????
          EXIT ? WHEN ?var1 % NotFound;
          ??????Dbms_Output.put_line(
          ' 生產(chǎn)通知單ID是: ' || v_pid);
          ????
          END ?LOOP;
          ????
          CLOSE ?var1;
          ??
          END ? IF ;????
          END ;



          -- 例16: 游標(biāo)中的更新和刪除
          --
          此例改自例8
          Declare
          ??
          -- 當(dāng)打開此游標(biāo),將鎖住了相關(guān)記錄
          ?? Cursor ?MyCur? Is
          ????
          SELECT ?Name? FROM ?Rs_Employees
          ??????
          Where ?HeTongId <= ' WL-090010 '
          ??????
          For ? Update ? OF ?Name;
          ??????
          BEGIN
          ??
          For ?tmp_cur? in ?MyCur
          ??Loop
          ????
          Update ?Rs_Employees
          ??????
          Set ?Name? = ?Name? || ? ' X '
          ??????
          Where ? Current ? of ?MyCur;
          ??
          End ?Loop;
          END ;

          posted on 2006-04-20 00:32 record java and net 閱讀(902) 評論(3)  編輯  收藏 所屬分類: Database

          評論

          # re: oracle游標(biāo)備忘 2006-04-20 10:32 song

          不錯。。

          多交流.e-mail:
          renxianqi2008@126.com

          希望能和我聯(lián)系一下..  回復(fù)  更多評論   

          # re: oracle游標(biāo)備忘 2007-09-07 13:32 woodhead

          對例七有疑問:

          select into 在沒有記錄返回時是會報(bào)錯的:ora-01403  回復(fù)  更多評論   

          # re: oracle游標(biāo)備忘 2009-02-05 10:05 klemo

          很不錯的例子  回復(fù)  更多評論   

          導(dǎo)航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動態(tài)語言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 金门县| 邵东县| 石门县| 平舆县| 宜兴市| 巴塘县| 车险| 于田县| 辛集市| 左云县| 高阳县| 承德县| 游戏| 广南县| 奉贤区| 天祝| 泸定县| 文水县| 定陶县| 应用必备| 高要市| 漾濞| 德化县| 江油市| 榆林市| 安阳县| 罗甸县| 柏乡县| 祁阳县| 阿图什市| 石景山区| 东乡县| 定远县| 黄石市| 宿松县| 闽清县| 新兴县| 顺昌县| 专栏| 宣汉县| 古田县|