1. 程式人生 > >day43_Oracle學習筆記_03

day43_Oracle學習筆記_03

十三、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壓縮包,如下圖所示:

解壓縮後,找到sqldeveloper.exe點選開啟即可。新建資料庫連線就可以使用了。如果想要連線Mysql資料庫,需要進行配置:工具 --> 首選項 --> 資料庫 --> 第三方 JDBC 驅動包 --> 新增條目,新增所需要的jar包。如下圖所示:

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

  PL/SQL程式從功能上來講,與上面JDBC的程式想要完成的功能是一樣的。學習PL/SQL程式的目的:  1、PL/SQL是Oracle對SQL語言的過程化擴充套件,操作效率更高。  2、PL/SQL在SQL命令語言中增加了過程處理語句(分支、迴圈等),使SQL語言具有過程處理能力。我們把SQL語言的資料操縱能力與過程語言的資料處理能力結合起來,使得PL/SQL面向過程但比過程語言簡單、高效、靈活和實用。  Oracle中對SQL語言的擴充套件叫做PL/SQL。  SQL Server中對SQL語言的擴充套件叫做Transact-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 numberis 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除)

--系統例外:被0set 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不能做分母');