day43_Oracle學習筆記_03
阿新 • • 發佈:2018-12-10
十三、PL/SQL程式設計
PL/SQL(Procedure Language/Structured Query Language)1、PL/SQL是一種高階資料庫程式設計語言,專門用於在各種環境下對Oracle資料庫進行訪問。該語言集成於資料庫伺服器中,所以PL/SQL程式碼可以對資料進行快速高效的處理。2、PL/SQL是對SQL語言儲存過程語言的擴充套件,是Oracle系統的核心語言。3、PL/SQL程式由三個塊組成:宣告部分、執行部分、異常處理部分。
13.1、sqldeveloper工具的使用
先去Oracle官網去下載最新版本的sqldeveloper,下載地址:https://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html得到2個zip壓縮包,如下圖所示:
13.2、小案例
小案例-回顧條件表示式:
給員工漲工資:總裁漲1000元 經理漲800元 其他漲400元寫一段java的JDBC程式,我們這裡寫的是虛擬碼,虛擬碼不能夠執行,但是可以幫助我們分析程式執行的過程和結構。ResultSet rs = "select empno,job from emp";while(rs.next()) { int eno = rs.getInt("empno"); String job = rs.getString("job"); if("PRESIDENT".eauals(job)) { update emp sal=sal+1000 where empno=eno; } else if ("MANAGER".eauals(job)) { update emp sal=sal+800 where empno=eno; } else { update emp sal=sal+400 where empno=eno;}
PL/SQL = Procedure Language/SQL = 過程語言/SQL
13.3、PL/SQL程式--列印輸出Hello World
示例程式碼如下:
SQL> --宣告部分SQL> declare 2 --說明部分 3 begin 4 --程式部分 5 dbms_output.put_line('Hello World'); 6 end; 7 --退出編輯環境,並執行PL/SQL程式 8 /PL/SQL 過程已成功完成。SQL> --預設情況下,Oracle的輸出開關是關閉的。SQL> --如果要在螢幕上輸出資訊,需要將 serveroutput開關開啟 set serveroutput onSQL> set serveroutput onSQL> /Hello WorldPL/SQL 過程已成功完成。SQL>
13.4、變數和常量說明
PL/SQL程式結構截圖如下:
PL/SQL程式結構完整截圖如下:變數和常量說明:引用型變數示例程式碼:--查詢員工編號為7839的姓名和薪水set serveroutput ondeclare --定義變數儲存姓名和薪水 --pename varchar2(20); --psal number; --定義引用型變數儲存姓名和薪水 pename emp.ename%type; psal emp.sal%type;begin --得到姓名和薪水 --在PL/SQL中,賦值方式有兩種方式,一種是 := 一種是 使用關鍵字into select ename,sal into pename,psal from emp where empno=7839; dbms_output.put_line(pename||'的薪水是'||psal);end;/
記錄型變數示例程式碼:
--查詢員工編號為7839的姓名和薪水set serveroutput ondeclare --定義記錄型變數:代表一行 emp_rec emp%rowtype;begin select * into emp_rec from emp where empno=7839; dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal);end;/
如何定義常量呢?
pename emp.ename%type; psal emp.sal%type; 加一個constant,就變成常量了。 pename constant emp.ename%type; psal constant emp.sal%type;
13.5、分支
if語句示例程式碼:set serveroutput on--判斷使用者從鍵盤輸入的數字--接收鍵盤輸入--num: 地址值,在該地址上儲存了輸入的值。accept num prompt '請輸入一個數字';declare --定義變數儲存輸入的數字 pnum number := #begin if pnum = 0 then dbms_output.put_line('您輸入的是0'); elsif pnum = 1 then dbms_output.put_line('您輸入的是1'); elsif pnum = 2 then dbms_output.put_line('您輸入的是2'); else dbms_output.put_line('其他數字'); end if;end;/
13.6、迴圈
迴圈語句示例程式碼:--列印1~10set serveroutput ondeclare pnum number := 1;begin loop --退出條件 exit when pnum > 10; dbms_output.put_line(pnum); --加一 pnum := pnum + 1; end loop;end;/
13.7、游標Cursor(遊標)== ResultSet
示例:按員工的工種長工資,總裁漲1000元,經理漲800元,其他員工漲400元。示例程式碼截圖:
游標Cursor(遊標)詳解如下圖所示:示例程式碼:--查詢並列印員工的姓名和薪水/*1. 游標的屬性: %isopen(游標是否開啟) %rowcount(游標影響的行數) %found(游標找到內容) %notfound(游標沒有找到內容)2. Oracle中預設,一個會話中只能開啟300個游標SQL> --修改游標個數需要管理員許可權SQL> show userUSER 為 "SCOTT"SQL> conn sys/[email protected]:1521/orcl as sysdba已連線。SQL> show userUSER 為 "USER"SQL> show parameter cursorNAME TYPE VALUE------------------------------------ -------------------------------- -----------cursor_sharing string FORCEcursor_space_for_time boolean FALSEopen_cursors integer 300session_cached_cursors integer 20修改: alter system set open_cursors=400;3. (思考):上面引數 cursor_sharing 什麼作用? --> 對於資料庫效能優化非常有用。 EXACT(預設值), FORCE(應急使用), SIMILAR*/--示例:使用游標查詢員工姓名和工資,並列印set serveroutput ondeclare --定義一個游標 cursor cemp is select ename,sal from emp; --為這個游標定義所需要用到的對應的變數 pename emp.ename%type; psal emp.sal%type;begin --開啟游標 open cemp; loop --取一條記錄到變數中 fetch cemp into pename,psal; --退出條件 --exit when 沒有取到記錄; exit when cemp%notfound; --列印 dbms_output.put_line(pename||'的薪水是'||psal); end loop; --關閉游標 close cemp;end;/
再來給員工漲工資程式碼:
--示例:按員工的工種長工資,總裁漲1000元,經理漲800元,其他員工漲400元。set serveroutput ondeclare --alter table "SCOTT"."EMP" rename column "JOB" to empjob cursor cemp is select empno,empjob from emp; --為這個游標定義所需要用到的對應的變數 pempno emp.empno%type; pjob emp.empjob%type;begin open cemp; loop --取一條記錄到變數中 fetch cemp into pempno,pjob; exit when cemp%notfound; --判斷職位 if pjob = 'PRESIDENT' then update emp set sal=sal+1000 where empno=pempno; elsif pjob = 'MANAGER' then update emp set sal=sal+800 where empno=pempno; else update emp set sal=sal+400 where empno=pempno; end if; end loop; close cemp; --Oracle是自動開啟事務的 --Oracle預設的隔離級別是:read committed --why? --> ACID commit; dbms_output.put_line('漲工資完成');end;/
帶引數的游標示例程式碼如下:
--查詢某個部門的員工姓名set serveroutput ondeclare cursor cemp(dno number) is select ename from emp where deptno=dno; --不一樣的地方 pename emp.ename%type;begin open cemp(20); --不一樣的地方 loop fetch cemp into pename; exit when cemp%notfound; dbms_output.put_line(pename); end loop; close cemp;end;/
游標習題:請點選連結:XXX
13.8、例外
例外:是程式設計語言提供的一種功能,用來增強程式的健壯性和容錯性。Oracle中對異常的處理 1、系統定義的例外 No_data_found (沒有找到資料) Too_many_rows (select … into 語句中匹配多個行) Zero_Divide (被零除) Value_error (算術或轉換錯誤) Timeout_on_resource (在等待資源時發生超時) 2、使用者定義的例外 演示:系統定義的例外(被0除)
--系統例外:被0除set serveroutput ondeclare pnum number;begin pnum := 1/0;exception when zero_divide then dbms_output.put_line('1:0不能做分母'); dbms_output.put_line('2:0不能做分母');