1、PL/SQL簡介sql
一、概念:PL/SQL是Oracle在標準SQL語言上的過程性擴展。ide
二、優勢和特性模塊化
2、PL/SQL語言基礎oop
一、編寫PL/SQL應用程序時,只能嵌入select語句、DML語句和事務控制語句,不能嵌入DDL語句,DCL語句。性能
二、PL/SQL塊fetch
基本結構以下所示:spa
1 declare 2 /*定義部分-變量、常量、遊標、異常、例解*/ 3 begin 4 /*執行部分-PL/SQL,SQL 語句*/ 5 exception 6 /*異常處理部分-處理運行錯誤*/ 7 end;//塊結束標誌
三、PL/SQL數據類型(經常使用)設計
四、註釋:"--"單行註釋,"/*...*/"多行註釋code
3、PL/SQL控制結構blog
一、條件分支語句
用法以下所示:
1 --示例一 2 declare 3 v_sal number(6,2); 4 begin 5 select sal into v_sal from scott.emp where ename=trim('&ename'); 6 if v_sal<2000 then 7 update scott.emp set sal=v_sal+200 where ename=trim('&ename'); 8 end if; 9 end; 10 11 --示例二 12 declare 13 v_dep number(6,2); 14 v_sal number(6,2); 15 begin 16 select deptno,sal into v_dep,v_sal from scott.emp where ename=trim('&ename'); 17 if v_dep=10 then 18 update scott.emp set sal=v_sal+200 where deptno=10; 19 elsif v_dep=20 then 20 update scott.emp set sal=v_sal+100 where deptno=20; 21 else 22 update scott.emp set sal=v_sal+50 where deptno!=10 and deptno!=20; 23 end if; 24 end;
二、case語句
具體用法以下所示:
1 --示例一 2 declare 3 v_deptno scott.emp.deptno%type; 4 begin 5 v_deptno:=&deptno; 6 case v_deptno 7 when 10 then 8 update scott.emp set comm=100 where deptno=v_deptno; 9 when 20 then 10 update scott.emp set comm=80 where deptno=v_deptno; 11 when 30 then 12 update scott.emp set comm=60 where deptno=v_deptno; 13 else 14 dbms_output.put_line('該部門不存在!'); 15 end case; 16 end; 17 18 --示例二 19 declare 20 v_sal scott.emp.sal%type; 21 v_ename scott.emp.ename%type; 22 begin 23 select ename,sal into v_ename,v_sal from scott.emp where empno=&empno; 24 case 25 when v_sal<2000 then 26 update scott.emp set comm=100 where ename=v_ename; 27 when v_sal<3000 then 28 update scott.emp set comm=80 where ename=v_ename; 29 when v_sal<4000 then 30 update scott.emp set comm=50 where ename=v_ename; 31 end case; 32 end;
三、循環語句
具體用法以下所示:
1 --基本循環 2 declare 3 i int:=1; 4 begin 5 loop 6 dbms_output .put_line(i); 7 i:=i+1; 8 exit when i=10; 9 end loop; 10 end; 11 12--while循環 13 declare 14 i int:=1; 15 begin 16 while i<=10 loop 17 dbms_output.put_line(i); 18 i:=i+1; 19 end loop; 20 end; 21 22--for循環 23 declare 25 begin 26 for i in 1..10 loop 27 dbms_output.put_line(i); 28 end loop; 29 end;
4、異常處理
一、分類:預約義異常,非預約義異常,自定義異常
二、常見預約義異常
具體用法以下所示:
1 --預約義異常處理 2 eclare 3 v_ename scott.emp.ename%type; 4 begin 5 select ename into v_ename from scott.emp where empno=&empno; 6 dbms_output.put_line(v_ename); 7 exception 8 when no_data_found then 9 dbms_output.put_line('員工號不存在'); 10 end; 11 12 --自定義異常處理 13 declare 14 e_integerity exception;--定義非預約義異常 15 e_no_employee exception;--定義自定義異常 16 pragma exception_init(e_integerity,-2291);--關聯非預約義異常 17 begin 18 update scott.emp set deptno=40 where empno=-1; 19 if sql%notfound then 20 raise e_no_employee;--顯示觸發自定義異常 21 end if; 22 exception 23 when e_integerity then 24 dbms_output.put_line('該部門不存在!'); 25 when e_no_employee then 26 dbms_output.put_line('該員工不存在!'); 27 end;
5、遊標(處理select語句返回的多行數據)
(1)顯示遊標(查詢結構超過一行)在PL/SQL塊的聲明部分申明,在執行部分或異常處理部分打開遊標,提取數據,關閉遊標。
一、定義遊標(declare cursor cursor_name is select_statement;)
二、打開遊標(open cursor_name;)
三、提取數據
1 --每次提取一行 2 fetch cursot_name into variable1,variable2,..--variable :接收遊標數據的變量 3--每次提取多行 4 .或 fetch cursor_name into bulk collect into collect1,collect2...--collect :接收遊標結果的集合變量
四、關閉遊標(close cursor_name;)
五、顯示遊標屬性
具體用法以下所示:
1 declare 2 cursor emp_cursor 3 is 4 select ename,sal from scott.emp where deptno=20; 5 v_ename scott.emp.ename%type; 6 v_sal scott.emp.sal%type; 7 begin 8 open emp_cursor; 9 loop 10 fetch emp_cursor into v_ename,v_sal; 11 exit when emp_cursor%notfound; 12 dbms_output.put_line(v_ename||':'||v_sal); 13 end loop; 14 close emp_cursor; 15 end; 16 17 --參數遊標 18 declare 19 cursor emp_cursor(cno number) 20 is 21 select ename,sal from scott.emp where deptno=cno; 22 v_ename scott.emp.ename%type; 23 v_sal scott.emp.sal%type; 24 begin 25 if not emp_cursor%isopen then 26 27 open emp_cursor(10); 28 end if; 29 loop 30 fetch emp_cursor into v_ename,v_sal; 31 exit when emp_cursor%notfound; 32 dbms_output.put_line(v_ename||':'||v_sal); 33 end loop; 34 close emp_cursor; 35 end; 36 37 --使用遊標更新或刪除數據 38 declare 39 cursor emp_cursor 40 is 41 select ename,sal from scott.emp for update of sal;--在sal列上加上共享鎖 42 v_ename scott.emp.ename%type; 43 v_sal scott.emp.sal%type; 44 begin 45 open emp_cursor; 46 loop 47 fetch emp_cursor into v_ename,v_sal; 48 exit when emp_cursor%notfound; 49 if v_sal<2500 then 50 update scott.emp set sal=sal+150 where current of emp_cursor; 51 end if; 52 end loop; 53 close emp_cursor; 54 end; 55 --遊標的for循環語法 56 for record_name in curso_name loop 57 statement1; 58 statement2; 59 ... 60 end loop; --record_name:Oracle 隱式定義的記錄變量名 61 --遊標的for循環 62 declare 63 cursor emp_cursor 64 is select ename from scott.emp where deptno=20; 65 begin 66 for o in emp_cursor loop 67 dbms_output.put_line('第'||emp_cursor%rowcount ||'員工'||o.ename); 68 end loop; 69 end; 70 71 72 --不使用遊標屬性的for循環 73 begin 74 for o in (select ename from scott.emp where deptno=20) 75 loop 76 dbms_output.put_line(o.ename); 77 end loop; 78 end; 79 80 select * from scott.emp;