日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Oracle中游標(biāo)Cursor的用法詳解

瀏覽:322日期:2023-03-12 15:25:10
目錄
  • 一、使用游標(biāo)
    • 1.定義游標(biāo)
    • 2.打開游標(biāo)
    • 3.提取數(shù)據(jù)
    • 4.關(guān)閉游標(biāo)
    • 5.游標(biāo)屬性
    • 6.參數(shù)游標(biāo)
  • 二、for循環(huán)遍歷,實(shí)現(xiàn)遍歷游標(biāo)最高效方式。
    • 三、使用游標(biāo)更新或刪除數(shù)據(jù)
      • 四、通過bulk collect減少loop處理的開銷
        • 五、使用游標(biāo)變量
          • 1.游標(biāo)變量使用步驟
            • 1.1定義ref cursor類型和游標(biāo)變量
            • 1.2打開游標(biāo)
            • 1.3提取游標(biāo)數(shù)據(jù)
            • 1.4關(guān)閉游標(biāo)變量
          • 2.游標(biāo)變量使用示例

          一、使用游標(biāo)

          對(duì)于DML語句和單行select into ,oracle自動(dòng)分配隱形游標(biāo)。處理select返回多行語句,可以使用顯式游標(biāo)。

          使用顯示游標(biāo)處理多行數(shù)據(jù),也可使用SELECT..BULK COLLECT INTO 語句處理多行數(shù)據(jù).

          1.定義游標(biāo)

          cursor cursor_name is select_statement;

          2.打開游標(biāo)

          執(zhí)行對(duì)應(yīng)的SELECT語句并將SELECT語句的結(jié)果暫時(shí)存放到結(jié)果集中.

          open cursor_name;

          3.提取數(shù)據(jù)

          打開游標(biāo)后,SELECT語句的結(jié)果被臨時(shí)存放到游標(biāo)結(jié)果集中,使用FETCH語句只能提取一行數(shù)據(jù)

          通過使用FETCH..BULK COLLECT INTO語句每次可以提取多行數(shù)據(jù)

          fetch cursor_name into variable1,varibale2,...;
          
          fetch cursor_name bulk collect into collect1,collect2,...[limit rows];

          (1)游標(biāo)中使用fetch..into語句:只能處理一行數(shù)據(jù),除非用循環(huán)語句

          declare
            v_bookname varchar2(100);
            cursor c_book(i_id number) is select bookname from book where id = i_id;
              begin
          Open c_book(10);--打開游標(biāo)
          Loop
              Fetch c_book into v_bookname; --提取游標(biāo)
              exit when c_book%notfound;
              update book set price = "33" where bookname = v_bookname;
          End Loop;
          Close c_book;--關(guān)閉游標(biāo)
              end;

          declare
            v_bookname varchar2(100);
            cursor c_book(i_id number) is select bookname from book where id = i_id;
          begin
            Open c_book(10);
            Fetch c_book into v_bookname;--預(yù)先Fetch一次
            While c_book%found Loop
                update book set price = "33" where bookname = v_bookname;
                 Fetch c_book into v_bookname;
            End Loop;
           Close c_book;
          end;

          (3)基于游標(biāo)定義記錄變量

          declare
              cursor emp_cursor is select ename,sal from emp;
              emp_record emp_cursor%rowtype;
            begin
              open emp_cursor;
              loop
               fetch emp_cursor into emp_record;
               exit when emp_cursor%notfound;
               dbms_output.put_line("雇員名:"||emp_record.ename||",雇員工資:"||emp_record.sal);
              end loop;
           end;

          4.關(guān)閉游標(biāo)

          close cursor_name;

          5.游標(biāo)屬性

          用于返回顯示游標(biāo)的執(zhí)行信息,包括%isopen,%found,%notfound,%rowcount

          • %isopen:確定游標(biāo)是否打開
          • %found:檢查是否從結(jié)果集中提取到了數(shù)據(jù)
          • %notfound:與%found行為相反。
          • %rowcount:返回當(dāng)前行為止已經(jīng)提取到的實(shí)際行數(shù)

          no_data_found和%notfound的用法是有區(qū)別的,小結(jié)如下1)SELECT. . . INTO 語句觸發(fā) no_data_found;
          2)當(dāng)一個(gè)顯式光標(biāo)(靜態(tài)和動(dòng)態(tài))的 where 子句未找到時(shí)觸發(fā) %notfound;
          3)當(dāng)UPDATE或DELETE語句的where 子句未找到時(shí)觸發(fā) sql%notfound;
          4)在光標(biāo)的提取(Fetch)循環(huán)中要用 %notfound 或%found 來確定循環(huán)的退出條件,不要用no_data_found。

          6.參數(shù)游標(biāo)

          注意:定義參數(shù)游標(biāo)時(shí),游標(biāo)參數(shù)只能指定數(shù)據(jù)類型,而不能指定長(zhǎng)度。

          declare
              cursor emp_cursor(no number) is select ename from emp where deptno=no;
              v_ename emp.ename%type;
            begin
              open emp_cursor(10);
              loop
               fetch emp_cursor into v_ename;
               exit when emp_cursor%notfound;
               dbms_output.put_line(v_ename);
              end loop;
              close emp_cursor;
            end;

          二、for循環(huán)遍歷,實(shí)現(xiàn)遍歷游標(biāo)最高效方式。

          使用FOR循環(huán)時(shí),ORACLE會(huì)隱含的打開游標(biāo),提取游標(biāo)數(shù)據(jù)并關(guān)閉游標(biāo)。

          每循環(huán)一次提取一次數(shù)據(jù),在提取了所有數(shù)據(jù)后,自動(dòng)退出循環(huán)并隱含的關(guān)閉游標(biāo)。

          1.使用游標(biāo)FOR循環(huán)

          --不需要聲明v_bookname,Open和Close游標(biāo)和fetch操作(不用打開游標(biāo)和關(guān)閉游標(biāo),實(shí)現(xiàn)遍歷游標(biāo)最高效方式)
          declare
           cursor c_book(i_id number) is select bookname from book where id = i_id;
          begin
             for cur in c_book(10) loop --循環(huán)變量cur不需要聲明
               update book set price = "53" where bookname = cur.bookname;
             end loop;
          end;

          2.在游標(biāo)FOR循環(huán)中直接使用子查詢

          begin
               for emp_record in (select ename,sal from emp) loop
          dbms_output.put_line(emp_record.ename);
              end loop;
          end;

          三、使用游標(biāo)更新或刪除數(shù)據(jù)

          要通過游標(biāo)更新或刪除數(shù)據(jù),在定義游標(biāo)時(shí)必須要帶有FOR UPDATE子句

          cursor cursor_name(parameter_name datetype) is select_statement for update [of column_reference] [nowait];
          • for update子句:用于在游標(biāo)結(jié)果集數(shù)據(jù)上家行共享鎖,防止其他用戶在相應(yīng)行執(zhí)行DML操作
          • of子句:確定哪些表要加鎖,沒有OF子句,則在所引用的全部表上加鎖
          • nowait子句:用于指定不等待鎖
          • 必須在UPDATE后DELETE語句中引用WHERE CURRENT OF子句
            update table_name set column=.. where current of cursor_name;
            delete table_name where current of cursor_name;
          declare
              cursor emp_cursor is select ename,sal from emp for update;
              v_ename emp.ename%type;
              v_sal emp.sal%tyep;
            begin
              open emp_cursor;
              loop
               fetch emp_cursor into v_ename,v_oldsal;
               exit when emp_cursor%notfound;
               if v_oldsal<2000 then
          update emp set sal=sal+100 where current of emp_cursor;--delete from emp where current of emp_cursor;
               end if;
             end loop;
             close emp_cursor;
           end;

          四、通過bulk collect減少loop處理的開銷

          將查詢結(jié)果一次性加載到集合中,而不是一條一條的加載。

          (1)在顯示游標(biāo)中,使用FETCH..BALK COLLECT INTO語句提取所有數(shù)據(jù)

          declare
             cursor emp_cursor is select ename from emp where deptno=10;
              type ename_table_type is table of varchar2(10);
              ename_table ename_table_type;
            begin
              open emp_cursor;
              fetch emp_cursor bulk collect into ename_table;
              for i in 1..ename_table.count loop
                 dbms_output.put_line(ename_table(i));
              end loop;
              close emp_cursor;
            end;

          (2)游標(biāo)中使用FETCH..BULK COLLECT INTO ..LIMIT語句提取部分?jǐn)?shù)據(jù)

          declare
              type name_array_type is varray(5) of varchar2(10);
              name_array name_array_type;
              cursor emp_cursor is select ename from emp;
              rows int:=5;
              v_count int:=0;
            begin
              open emp_cursor;
              loop
               fetch emp_cursor bulk collect into name_array limit rows;
               dbms_output.pur("雇員名");
               for i in 1..(emp_currsor%rowcount-v_count) loop
                 dbms_output.put(name_array(i)||" ");
               end loop;
               dbms_output.new_line;
              v_count:=emp_cursor%rowcount;
              exit when emp_cursor%notfound;
              end loop;
              close emp_cursor;
            end;

          五、使用游標(biāo)變量

          PL/SQL的游標(biāo)變量中存放著指向內(nèi)存地址的指針.

          1.游標(biāo)變量使用步驟

          包括定義游標(biāo)變量,打開游標(biāo),提取游標(biāo)數(shù)據(jù),關(guān)閉游標(biāo)等四個(gè)階段

          1.1定義ref cursor類型和游標(biāo)變量

          type ref_type_name is ref cursor [return return_type];
          
          cursor_varibale ref_type_name;

          當(dāng)指定RETURN子句時(shí),其數(shù)據(jù)類型必須是記錄類型,不能在包內(nèi)定義游標(biāo)變量

          1.2打開游標(biāo)

          open cursor_variable for select_statement;

          1.3提取游標(biāo)數(shù)據(jù)

          fetch cursor_varibale into variable1,variable2,...;
          
          fetch cursor_varibale bulk collect into collect1,collect2,...[limit rows]

          1.4關(guān)閉游標(biāo)變量

          close cursor_varibale;

          2.游標(biāo)變量使用示例

          1、在定義FEF CURSOR類型時(shí)不指定RETURN子句

          在打開游標(biāo)時(shí)可以指定任何的SELECT語句

          declare
              type emp_cursor_type is ref cursor;
              emp_cursor emp_cursor_type;
              emp_record emp%rowtype;
            begin
              open emp_cursor for select * from emp where deptno=10;
              loop
               fetch emp_cursor into emp_record;
               exit when emp_cursor%notfound;
               dbms_output.put_line("第"||emp_curosr%rowcount||"個(gè)雇員: "||emp_record.ename);
              end loop;
              close emp_cursor;
            end;

          2、在定義REF CURSOR類型時(shí)指定RETURN子句

          在打開游標(biāo)時(shí)SELECT語句的返回結(jié)果必須與RETURN子句所指定的記錄類型相匹配.

          declare
              type emp_record_type is record(name varchar2(10),salary number(6,2));
              type emp_cursor_type is ref cursor return emp_record_type;
              emp_cursor emp_cursor_type;
              emp_record emp_record_type;
            begin
              open emp_cursor for select ename,sal from emp where deptno=20;
              loop
               fetch emp_cursor into emp_record;
               exit when emp_cursor%notfound;
               dbms_output.put_line("第"||emp_curosr%rowcount||"個(gè)雇員: "||emp_record.ename);
              end loop;
              close emp_cursor;
           end;

          到此這篇關(guān)于Oracle中游標(biāo)Cursor用法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持。

          標(biāo)簽: Oracle
          相關(guān)文章:
          日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
          自由日本语亚洲人高潮| 亚洲欧美日本日韩| 最新亚洲国产| 亚洲一级黄色| 一区二区视频欧美| 99xxxx成人网| 亚洲免费黄色| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲国内欧美| 石原莉奈在线亚洲三区| 亚洲精品自拍| 国产欧美日韩一级| 国产精品一国产精品| 欧美久久一区二区三区| 亚洲精品进入| 欧美永久精品| 国产一区二区三区黄网站| 91麻豆国产自产在线观看亚洲| 国产精品久久久久久久免费软件| 久久av超碰| 久久久成人网| 成人羞羞视频播放网站| 欧美日韩视频| 国产精品蜜月aⅴ在线| av资源亚洲| 三级一区在线视频先锋| 国产亚洲久久| 欧美日韩水蜜桃| 日韩激情一区二区| 你懂的国产精品| 欧美丝袜一区| 国产精品巨作av| 久久精品亚洲人成影院| 亚洲一区av| 国模大尺度视频一区二区| 伊人影院久久| 久久99国产精品视频| 亚洲激情国产| 久久久久久婷| 色综合视频一区二区三区日韩| 精品99在线| 日本aⅴ亚洲精品中文乱码| 国产在线|日韩| 国产精品久久久久久久久久久久久久久 | 日韩黄色免费网站| 日韩电影免费在线观看| 亚洲久草在线| 激情婷婷综合| 亚洲va中文在线播放免费| 国产精品网址| 亚洲精品影视| 久久都是精品| 精品一区亚洲| 欧美影院三区| 久久久久99| 日韩另类视频| 久久久国产亚洲精品| 久久国产精品美女| 91成人福利| 欧美日韩18| 欧美一级全黄| 国产精品国码视频| 国产精品久久乐| 日本久久黄色| 亚洲精品在线影院| 婷婷激情一区| 久久国产小视频| 免费不卡中文字幕在线| 欧美精品一区二区久久| 亚洲一级高清| 国产亚洲精品自拍| 丝瓜av网站精品一区二区| 久久在线视频免费观看| 婷婷色综合网| 视频一区二区中文字幕| 亚洲久久一区| 国产精品免费精品自在线观看| 国产精品一区二区三区美女| 麻豆久久久久久| 不卡专区在线| 欧美+日本+国产+在线a∨观看| 亚洲国产日韩欧美在线| 久久午夜视频| 国产精品hd| 伊人久久大香线蕉av不卡| 99在线观看免费视频精品观看| 日韩专区在线视频| 日韩欧美中文在线观看| 欧美经典一区| 亚洲美洲欧洲综合国产一区| 国产欧美午夜| 一区二区小说| 国产精品一区二区av交换| 蜜桃一区二区三区| 青青草91久久久久久久久| 日韩88av| 日韩一区二区三区高清在线观看| 青草综合视频| 99久久夜色精品国产亚洲狼 | 性色av一区二区怡红| 视频一区二区中文字幕| 国产精品**亚洲精品| 欧美综合另类| 国产毛片精品| 亚洲一区欧美二区| 麻豆视频在线观看免费网站黄 | 日韩黄色大片网站| 日韩综合小视频| 亚洲性图久久| 最新中文字幕在线播放 | 美女91精品| 中文在线а√天堂 | 99国产精品久久久久久久 | 日本一区二区三区中文字幕| 韩国精品主播一区二区在线观看| 97久久亚洲| 亚洲深深色噜噜狠狠爱网站 | 中文字幕亚洲在线观看| 国产在线欧美| 桃色一区二区| 日本91福利区| 日韩va亚洲va欧美va久久| 蘑菇福利视频一区播放| 日韩午夜一区| 亚洲免费激情| 一区在线视频观看| 国产一区亚洲| 国产一区久久| 宅男噜噜噜66国产日韩在线观看| 欧美成人高清| 激情婷婷欧美| 欧美日韩在线网站| 亚洲黑丝一区二区| 久久精品一区二区国产| 久久国内精品视频| 日本在线成人| 日韩动漫一区| 日韩精品久久理论片| 亚洲日韩视频| 国产精品theporn| 国产一区二区三区四区五区| 成人在线视频区| 久草免费在线视频| 欧美日韩视频一区二区三区| 在线精品视频在线观看高清| 免播放器亚洲一区| 婷婷综合一区| 精品日韩一区| 久久婷婷激情| 免费日韩av| 欧美伊人影院| 国产精品毛片久久| 亚洲一区日韩在线| 国产精品任我爽爆在线播放 | 黑丝一区二区三区| 日本高清久久| 日韩成人亚洲| 老牛影视一区二区三区| 国产色噜噜噜91在线精品| 四虎8848精品成人免费网站| 午夜欧美视频| 久久精品资源| 视频一区在线播放| 老司机精品在线| 日韩不卡视频在线观看| 亚洲1区在线观看| 国产在线看片免费视频在线观看| 日韩午夜在线| 激情黄产视频在线免费观看| 亚洲精品伊人| 欧美一区二区三区高清视频| 国产日产精品_国产精品毛片 | 国产毛片久久| 日韩国产精品久久久久久亚洲| 国产一区福利| 激情亚洲影院在线观看| 亚洲成人va| 久久99久久人婷婷精品综合| 亚洲欧洲另类| 久久国产电影| 国产精品高潮呻吟久久久久| 久久xxxx| 伊人精品一区| 国产一区三区在线播放| 国产精品美女| 电影天堂国产精品| 国产欧美日本| 亚洲丝袜啪啪| 麻豆视频久久| 国产精品一区二区美女视频免费看| 蜜桃国内精品久久久久软件9| 日日夜夜免费精品| 久久高清国产| 婷婷综合社区| www在线观看黄色| 日韩在线短视频| www在线观看黄色| 成人亚洲精品| 日韩黄色大片网站| 日韩欧美一区二区三区免费观看|