亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

oracle cursor and exception

2024-08-29 13:54:52
字體:
來源:轉載
供稿:網友
/*游標是SQL的一個內存工作區,有系統或用戶以變量的形式定義。游標的作用就是用于臨時存儲從數據庫中提取的數據塊。游標有兩種類型:顯示游標和隱式游標。一次從數據庫中提取一行數據,對于這種形式的查詢和DML操作,系統都會使用一個隱式游標,如果要提取多行數據,就要有程序員定義一個顯示游標,并通過與游標有關的語句進行處理。顯示游標對應一個返回結果為多行多列的SELECT語句。游標一旦打開,數據就從數據庫中傳送到游標變量中,然后應用程序再從游標中分解出需要的數據,并進行處理。*//**隱式游標DML操作和單行SELECT語句使用隱式游標INSERT, UPDATE,  DELETE,  SELECT...INTO...當系統使用一個隱式游標時,可以通過隱式游標的屬性來了解操作的狀態和結果,進而控制程序的流程。隱式游標可以使用名字SQL來訪問,但要注意,通過SQL游標名總是只能訪問前一個DML操作或單行SELECT操作的游標屬性。所以通常在剛剛執行完操作之后哦,立即使用SQL游標名來訪問屬性。游標的屬性有以下四種:隱式游標的屬性          返回值類型      意 義SQL%ROWCOUNT           整型             代表DML 語句成功執行的數據行數SQL%FOUND              布爾型            值為TRUE 代表插入、刪除、更新或單行查詢操作成功SQL%NOTFOUND           布爾型            與SQL%FOUND 屬性返回值相反SQL%ISOPEN             布爾型            DML 執行過程中為真,結束后為假*/--使用隱式游標的屬性,判斷對雇員工資的修改是否成功declarebegin  update scott.emp emp set emp.sal = sal+100  where empno=7788;  if SQL%FOUND then    dbms_output.put_line('OK');     commit;  else      dbms_output.put_line('fail');   end if;end;      --使用隱式游標的屬性,判斷修改員工的行數declarebegin     update scott.emp emp set emp.sal = sal+1;       dbms_output.put_line(SQL%ROWCOUNT);    end;     --輸出結果:20/**顯示游標顯示游標的使用分為以下4個步驟1. 聲明游標  在DECLARE部分按以下格式聲明游標:  CURSOR 游標名[(參數1 數據類型[,參數2 數據類型...])]  IS SELECT語句:  參數是可選部分,所定義的參數可以出現在SELECT語句的WHERE子句中。如果定義了參數,則必須在打開游標時傳遞相應的實際參數  SELECT語句是對表或視圖的查詢語句,甚至也可以是聯合查詢,可以帶WHERE條件、ORDER BY或GROUP BY等子句,但不能使用INTO子句。在SELECT語句中可以使用在定義游標之前定義的變量2. 打開游標  在可執行部分,按以下格式打開游標  OPEN 游標名[(實際參數1[,實際參數2...])]  打開游標時,SELECT語句的查詢結果就被傳遞到了游標工作區。3. 提取數據  在可執行部分,按以下格式將游標工作區中的數據提取到變量中。提取操作必須在打開游標之后進行。  FETCH 游標名 INTO 變量名1,變量2...]  或  FETCH 游標名 INTO 記錄變量;  游標打開后有一個指針指向數據區,FETCH語句一次返回指針值得一行數據,要返回多行重復執行,可以使用循環語句來實現??刂蒲h可以通過判斷游標的屬性來進行。下面對這兩種格式進行說明: 1).變量名是用來從游標中提取數據的變量,需要事先定義。變量的個數和類型應該與SELECT語句中的字段變量的個數和類型一致 2).一次將一行數據提取到記錄變量中,需要使用%ROWTYPE事先定義記錄變量,這種形式使用起來比較方便,不必分別定義和使用 多個變量     定義記錄變量的方法如下:     變量名 表名|游標名%ROWTYPE;     其中的表必須存在,游標名也必須先定義      4. 關閉游標  CLOSE 游標名  顯示游標名打開后,必須顯示地關閉。游標一旦關閉,游標占用的資源就被釋放,游標變成無效,必須重新打開才能使用。*/      --用游標提取emp表中7788雇員的名稱和職務declare v_ename varchar(10); v_job varchar(10); cursor emp_cursor IS select emp.ename, emp.job from scott.emp emp; begin   open emp_cursor;   fetch emp_cursor into v_ename, v_job;   DBMS_OUTPUT.PUT_LINE(v_ename||','||v_job);    close emp_cursor;   end; --執行結果:SCOTT,ANALYST   --用游標變量提取emp中7788雇員的名稱和職務  declare    cursor emp_cursor is    select emp.ename, emp.job from scott.emp emp where emp.empno=7788;    emp_record emp_cursor%ROWTYPE;    begin      open emp_cursor;      fetch emp_cursor into emp_record;      DBMS_OUTPUT.PUT_LINE(emp_record.ename||','||emp_record.job);      close emp_cursor;      end; --執行結果:SCOTT,ANALYST           --顯示工資最高的前三名雇員的名稱和工資。DECLARE v_ename varchar(10); v_sal number(5); cursor emp_cursor is select emp.ename, emp.sal from scott.emp emp where sal>0 order by sal desc ; begin   open emp_cursor;   for i in 1..3 loop     fetch emp_cursor into v_ename, v_sal;      DBMS_OUTPUT.PUT_LINE(v_ename||','||v_sal);   end loop;        close emp_cursor; end;           /*輸出結果KING,5000SCOTT,3100FORD,3000*//* 游標循環 1*/--顯示全部雇員的編號和名稱。DECLARE  CURSOR emp_cursor is select empno, ename from scott.emp; begin   for emp_record in emp_cursor loop     DBMS_OUTPUT.PUT_LINE(emp_record.empno||emp_record.ename);     end loop; end;/* 游標循環 2 省略游標的定義,游標的SELECT查詢語句在循環中直接出現*/declarebegin  for re in(select emp.ename from scott.emp emp) loop    DBMS_OUTPUT.PUT_LINE(re.ename);  end loop;end;/*顯示游標屬性雖然可以使用前面的形式獲得游標數據,但是在游標定義以后使用它的一些屬性結構控制是一種更為靈活的方法。顯示游標的屬性如表:游標的屬性    返回值類型        意 義%ROWCOUNT      整型             獲得FETCH 語句返回的數據行數%FOUND         布爾型           最近的FETCH 語句返回一行數據則為真,否則為假%NOTFOUND      布爾型           與%FOUND 屬性返回值相反%ISOPEN        布爾型           游標已經打開時值為真,否則為假可按照以下形式取得游標的屬性游標名%屬性要判斷游標emp_cursor是否處于打開狀態,可以使用屬性emp_cursor%ISOPEN。如果游標已經打開,則返回值為"真",否則為"假"*/declarev_ename varchar2(10);cursor emp_cursor isselect emp.ename from scott.emp emp;begin  open emp_cursor;  if emp_cursor%ISOPEN then    loop      fetch emp_cursor into v_ename;      exit when emp_cursor%NOTFOUND;      DBMS_OUTPUT.PUT_LINE(to_char(emp_cursor%ROWCOUNT)||'-'||v_ename);    end loop;  else    DBMS_OUTPUT.PUT_LINE('用戶信息:游標沒有打開!');  end if;   close emp_cursor;  end;--帶參數的游標 打開游標的時候的參數declarev_empno number(5);v_ename varchar2(10);cursor emp_cursor(p_deptno number, p_job varchar2) is select empno, ename from scott.emp emp where emp.deptno=p_deptno and emp.job=p_job; begin   open emp_cursor(10, 'CLERK');   if emp_cursor%ISOPEN then     loop       fetch emp_cursor into v_empno, v_ename;       dbms_output.put_line(v_empno||'-'|| v_ename);       exit when emp_cursor%NOTFOUND;     end loop;   else     DBMS_OUTPUT.PUT_LINE('用戶信息:游標沒有打開!');   end if; end;  --帶參數的游標 通過變量向游標傳遞參數,變量需要先于游標定義,并在游標打開之前賦值 declare  v_empno number(5);  v_ename varchar(10);  v_depno number(5);  v_job varchar2(10);  cursor emp_cursor IS   select emp.empno, emp.ename from scott.emp emp where emp.deptno=v_depno and emp.job=v_job;   begin     v_depno:=10;     v_job:='CLERK';     open emp_cursor;     loop        fetch emp_cursor into v_empno, v_ename;       exit when emp_cursor%NOTFOUND;       DBMS_OUTPUT.PUT_LINE(v_empno||','||v_ename);     end loop;   end; --輸出結果:7934,MILLER/* 動態SELECT語句和動態游標的用法  對于查詢結果為一行的select語句,可以用動態生成查詢語句字符串的方法,在程序執行階段臨時生成并執行, execute immediate 查詢語句字符串 into 變量1、、*/declarestr varchar2(100);v_ename varchar2(10);begin  str := 'select emp.ename from scott.emp emp where emp.empno=7788';  execute immediate str into v_ename;  dbms_output.put_line(v_ename);  end;/*定義游標類型的語句如下:TYPE 游標類型名 REF CURSOR聲明游標變量的語句如下:在可執行部分可以如下形式打開一個動態游標open 游標變量名 for 查詢語句字符串;*/--按名字中包含的字母順序分組顯示雇員信息declaretype cur_type is ref cursor;cur cur_type;--聲明為一個未綁定的游標rec scott.emp%rowtype;str varchar2(550);letter char :='A';begin  loop    str:='select emp.ename from scott.emp where emp.ename like ''%'||letter||'%''';    open cur for str;    dbms_output.put_line('包含字母'||letter||'的名字:');    loop      fetch cur into rec.ename;      exit when cur%notfound;      dbms_output.put_line(rec.ename);    end loop;    exit when letter='Z';    letter:=chr(ascii(letter)+1);    end loop; end;        /* 異常處理  錯誤是在標準包中由系統預定義的標準錯誤,或是有用戶在程序的說明部分自定義的錯誤。  */  --查詢編號為1234的雇員名字 declare v_name varchar2(10); begin   select emp.ename into v_name from scott.emp emp where emp.empno=1234;   DBMS_OUTPUT.PUT_LINE('該雇員名字為:'|| v_name);   EXCEPTION     WHEN NO_DATA_FOUND THEN       DBMS_OUTPUT.PUT_LINE('無改用戶');      WHEN OTHERS THEN        DBMS_OUTPUT.PUT_LINE('其他錯誤'); end; --執行結果:無改用戶  --由程序代碼顯示系統錯誤  DECLARE  V_TEMP NUMBER(5):=1;  BEGIN    V_TEMP:=V_TEMP/0;    EXCEPTION      WHEN OTHERS THEN        DBMS_OUTPUT.PUT_LINE('發生系統錯誤!');         DBMS_OUTPUT.PUT_LINE('錯誤代碼:'|| SQLCODE( ));  DBMS_OUTPUT.PUT_LINE('錯誤信息:' ||SQLERRM( ));END;/*錯 誤 名 稱                      錯誤代碼       錯 誤 含 義CURSOR_ALREADY_OPEN          ORA_06511        試圖打開已經打開的游標INVALID_CURSOR               ORA_01001        試圖使用沒有打開的游標DUP_VAL_ON_INDEX             ORA_00001        保存重復值到惟一索引約束的列中ZERO_DIVIDE                  ORA_01476        發生除數為零的除法錯誤INVALID_NUMBER               ORA_01722        試圖對無效字符進行數值轉換ROWTYPE_MISMATCH             ORA_06504        主變量和游標的類型不兼容VALUE_ERROR                  ORA_06502        轉換、截斷或算術運算發生錯誤TOO_MANY_ROWS                ORA_01422        SELECT…INTO…語句返回多于一行的數據NO_DATA_FOUND                ORA_01403        SELECT…INTO…語句沒有數據返回TIMEOUT_ON_RESOURCE          ORA_00051        等待資源時發生超時錯誤TRANSACTION_BACKED_OUT       ORA_00060        由于死鎖,提交失敗STORAGE_ERROR                ORA_06500        發生內存錯誤PROGRAM_ERROR                ORA_06501        發生PL/SQL 內部錯誤NOT_LOGGED_ON                ORA_01012        試圖操作未連接的數據庫LOGIN_DENIED                 ORA_01017        在連接時提供了無效用戶名或口令www.*/--定義新的系統錯誤類型。DECLAREV_ENAME VARCHAR2(10);NULL_INSERT_ERROR EXCEPTION;PRAGMA EXCEPTION_INIT(NULL_INSERT_ERROR,-1400);BEGININSERT INTO EMP(EMPNO) VALUES(NULL);EXCEPTIONWHEN NULL_INSERT_ERROR THENDBMS_OUTPUT.PUT_LINE('無法插入NULL值!');WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE('發生其他系統錯誤!');END;--執行結果為:無法插入NULL值!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品免费在线播放| 热99在线视频| 久久99精品久久久久久琪琪| 国产精品444| 欧美性xxxxx极品娇小| 亚洲欧美制服综合另类| 国产视频在线观看一区二区| 久久人人看视频| 欧美老女人在线视频| 欧美国产视频一区二区| 色噜噜久久综合伊人一本| 日韩专区在线播放| 6080yy精品一区二区三区| 亚洲美女www午夜| 国产精品久久一| 一夜七次郎国产精品亚洲| 91免费在线视频网站| 久久精品久久久久久国产 免费| 久久久久久久久久亚洲| 日韩在线观看免费全集电视剧网站| 久色乳综合思思在线视频| 亚洲精品一区在线观看香蕉| 成人免费看黄网站| 欧美极品欧美精品欧美视频| 欧美视频裸体精品| 国色天香2019中文字幕在线观看| 中文字幕日韩欧美在线| 青青精品视频播放| 日韩美女免费观看| 国产va免费精品高清在线观看| 日韩电影中文字幕一区| 欧美日韩ab片| 国产欧美一区二区三区在线| 久久免费视频在线| 亚洲精品永久免费精品| 欧美日韩国产一区二区| 日韩最新免费不卡| 国产一区二区视频在线观看| 国产一区二区三区18| 欧美日韩一区二区在线播放| 精品在线观看国产| 国产一区二区三区欧美| 欧美野外猛男的大粗鳮| 亚洲女人初尝黑人巨大| 国产热re99久久6国产精品| 国产精品一二区| 欧美成人免费一级人片100| 性欧美长视频免费观看不卡| 亚洲电影免费观看高清| 国产视频精品xxxx| 欧美激情亚洲国产| 久久视频在线免费观看| 亚洲精品之草原avav久久| 精品视频久久久久久| 亚洲系列中文字幕| 欧美精品制服第一页| 国产成人jvid在线播放| 亚洲自拍av在线| 国产精品一久久香蕉国产线看观看| 一区二区三区动漫| 91丝袜美腿美女视频网站| 精品久久久一区二区| 久久全球大尺度高清视频| 国产精品视频网站| 成人免费视频a| 亚洲曰本av电影| 中文字幕亚洲二区| 国产精品久久久久aaaa九色| 欧美色视频日本高清在线观看| 亚洲久久久久久久久久久| 亚洲欧美在线免费| 色妞色视频一区二区三区四区| 国内精品国产三级国产在线专| 超薄丝袜一区二区| 另类专区欧美制服同性| 亚洲最大成人网色| 欧美俄罗斯性视频| 国产综合久久久久久| 在线国产精品播放| 亚洲国产精品嫩草影院久久| 日韩欧美在线看| 日韩成人av一区| 亚洲天堂第二页| 午夜精品久久久久久99热软件| 成人做爰www免费看视频网站| 日韩在线观看免费高清| 55夜色66夜色国产精品视频| 国产精品网站视频| 国产精品免费视频xxxx| 欧美激情一区二区三区成人| 九九九热精品免费视频观看网站| 久久久电影免费观看完整版| 成人做爰www免费看视频网站| 欧美电影免费在线观看| 国产精品日韩欧美大师| 91亚洲精品一区| 日韩精品极品视频免费观看| 国产成人亚洲精品| 91伊人影院在线播放| 综合136福利视频在线| 国产精品电影网站| 91精品国产99久久久久久| 欧美激情videoshd| 日本aⅴ大伊香蕉精品视频| 国产精品日韩欧美综合| 欧美精品videossex88| 日韩电视剧在线观看免费网站| 国产精品1234| 97在线视频免费播放| 国产精品一区二区久久精品| 亚洲欧美中文字幕在线一区| 国产精选久久久久久| 色综合色综合久久综合频道88| 久久久视频免费观看| 国产精品久久久久久久久久久久久| 亚洲欧美中文在线视频| 精品国产成人在线| 亚洲精品久久久久久久久久久| 亚洲免费视频观看| 亚洲国产美女精品久久久久∴| 视频在线观看一区二区| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲最大中文字幕| 欧美一级淫片播放口| 久久精品电影网站| 国产在线观看一区二区三区| 国产精品91久久久久久| 日韩成人中文字幕在线观看| 久久精品电影网站| 亚洲性夜色噜噜噜7777| 久久精品美女视频网站| 91亚洲精品久久久久久久久久久久| 在线观看日韩www视频免费| 国产精品入口免费视| 久久亚洲国产成人| 亚洲男人天天操| 国产偷国产偷亚洲清高网站| 国产精品国产三级国产aⅴ9色| 欧美日韩国产中文字幕| 欧美激情在线狂野欧美精品| 亚洲成色www8888| 欧美巨猛xxxx猛交黑人97人| 18久久久久久| 成人国产精品色哟哟| 日韩美女视频在线观看| 26uuu另类亚洲欧美日本一| 欧美一区二区影院| 亚洲人成在线一二| 亚洲第一在线视频| 日韩美女视频免费在线观看| 日韩av电影在线免费播放| 美乳少妇欧美精品| 国产一区二区久久精品| 国产精品入口日韩视频大尺度| 欧美国产日产韩国视频| 欧美高清视频在线播放| 26uuu久久噜噜噜噜| 91九色精品视频| 国产va免费精品高清在线| 北条麻妃一区二区在线观看| 成人黄色午夜影院| 91色视频在线观看| 日本精品久久久久影院| 色999日韩欧美国产|