blogjava's web log

          blogjava's web log
          ...

          oracle游標備忘

          -- 例六:%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,查詢記錄行數
          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 ;???
          ???
          ?
          ?
          -- 例八:顯式游標
          --
          以下示例在所有游標的記錄中的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
          ??
          -- 打開游標?
          ?? Open ?MyCur;
          ??
          -- 進入循環
          ??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(
          ' 游標未打開 ' );
          ????
          -- 打開游標?
          ???? Open ?MyCur;
          ??
          end ? if ;

          ??
          -- 進入循環
          ??Loop
          ????
          Fetch ?MyCur? Into ?v_row;
          ????
          Exit ? When ?MyCur % NotFound;
          ??
          ????Dbms_Output.put_line(
          ' 當前已取得 ' || 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(
          ' 游標已打開 ' );
          ????
          Close ?MyCur;
          ??
          end ? if ;

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

          -- 例12:查詢嵌套表中數據的游標
          --
          1?創建類型
          ?? CREATE ? OR ? REPLACE ?TYPE?emp_type? As ?Object?
          ???(eno???
          number ,
          ????ename?
          varchar2 ( 20 ),
          ????esal??
          number );
          -- 2?使用Table?of?子句創建Table類型
          ?? CREATE ?TYPE?emp_nt? AS ? Table ? Of ?emp_type;
          -- 3?使用emp_nt數據類型創建myemp表
          ?? CREATE ? TABLE ?myemp
          ???(deptno?????
          number ,
          ????edet???????emp_nt)
          ????NESTED?
          TABLE ?edet?Store? As ?myemployee;
          -- 4?初始化myemp的數據
          ?? Insert ? Into ?myemp? values
          ????(
          10 ,emp_nt(emp_type( 1000 , ' James ' ,? 10000 ),
          ???????????????emp_type(
          1001 , ' Daniel ' , 20000 )));
          ??
          Commit ;
          ??
          -- 執行下列代碼??
          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
          ??
          -- 打開游標?
          ?? Open ?MyCur;
          ??
          -- 進入循環
          ??Loop
          ????
          Fetch ?MyCur? Into ?sal,ena;
          ????
          Exit ? When ?MyCur % NotFound;
          ????Dbms_Output.put_line(ena
          || ' ???? ' || sal);
          ??
          End ?Loop;
          ??
          ??
          Close ?MyCur;
          END ;




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

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

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


          -- 再示范帶參數的游標
          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(
          ' 當前已取得 ' || MyCur % RowCount || ' ' );
          ????Dbms_Output.put_line(
          ' 姓名: ' || tmp_cur.Name || ' ???? ' || ' 合同號: ' || tmp_cur.HeTongId);
          ??
          End ?Loop;

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


          -- 再示范以下寫法
          --
          在循環游標中使用查詢
          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:示范游標變量
          --
          此例要在Command?window或Sql?Plus中示范,結果會有點區別
          --
          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(
          ' 生產通知單ID是: ' || v_pid);
          ????
          END ?LOOP;
          ????
          CLOSE ?var1;
          ??
          END ? IF ;????
          END ;



          -- 例16: 游標中的更新和刪除
          --
          此例改自例8
          Declare
          ??
          -- 當打開此游標,將鎖住了相關記錄
          ?? 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游標備忘 2006-04-20 10:32 song

          不錯。。

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

          希望能和我聯系一下..  回復  更多評論   

          # re: oracle游標備忘 2007-09-07 13:32 woodhead

          對例七有疑問:

          select into 在沒有記錄返回時是會報錯的:ora-01403  回復  更多評論   

          # re: oracle游標備忘 2009-02-05 10:05 klemo

          很不錯的例子  回復  更多評論   

          導航

          常用鏈接

          留言簿(44)

          新聞檔案

          2.動態語言

          3.工具箱

          9.文檔教程

          友情鏈接

          搜索

          最新評論

          主站蜘蛛池模板: 汶川县| 乌兰县| 太康县| 平武县| 邹城市| 法库县| 广州市| 庆城县| 乌鲁木齐县| 永年县| 久治县| 安岳县| 始兴县| 乡宁县| 西贡区| 鱼台县| 固原市| 禹城市| 龙井市| 五峰| 绥阳县| 万年县| 鹿泉市| 栖霞市| 岳普湖县| 南召县| 南投市| 历史| 安义县| 隆子县| 策勒县| 民丰县| 云龙县| 屏东市| 岳池县| 合阳县| 永寿县| 聊城市| 兴城市| 兴隆县| 维西|