Oracle中PL/SQL簡介、基本語法以及數據類型
一.PL/SQL簡介。
Oracle PL/SQL語言(Procedural Language/SQL)是結合了結構化查詢和Oracle自身過程控制為一體的強大語言,PL/SQL不但支持更多的數據類型,擁有自身的變量申明,賦值語句,而且還有條件,循環等流程控制語句。過程控制結構與SQL數據處理能力無縫的結合形成了強大的編程語言,可以創建過程和函數以及程序包。
PL/SQL是一種塊結構的語言,它將一組語句放在一個塊中,一次性的發送給服務器,由服務器和自身引擎兩個執行器執行代碼。如下圖:
優點:
- 支持SQL
SQL是訪問數據庫的標准語言,通過SQL命令,用戶可以操縱數據庫的數據。PL/SQL支持所有的SQL數據操縱命令、游標控制命令、事務控制命令、SQL函數、運算符和偽列。
同時PL/SQL和SQL語言緊密集成,PL/SQL支持所有的SQL數據類型和NULL值。
- 支持面向對象編程
PL/SQL支持面向對象的編程,在PL/SQL中可以創建類型,可以對類型進行繼承,可以在子程序中重載方法等。
- 更好的性能
SQL是非過程語言,只能一條一條的執行,而PL/SQL把一個PL/SQL統一進行編譯后執行,同時還可以把編譯好的PL/SQL塊存儲起來,以備重用,減少了應用程序和服務器之間的通 信時間,所以PL/SQL是高效而快速的。
- 可移植性
使用PL/SQL編寫的應用程序語言,可以移植到任何操作平台的ORACLE服務器,同時還可以編寫可移植程序庫,在不同環境中使用。
- 安全性
可以通過存儲過程對客戶機和服務器之間的應用程序邏輯進行分割,這樣可以限制對ORACLE數據庫的訪問,數據庫還可以授權和撤銷其他用戶的訪問權利。
二.PL/SQL基本語法。
PL/SQL是一種塊結構的語言。一個PL/SQL包含了一個或多個邏輯快,邏輯塊中可以聲明變量、寫程序主體、還可以捕獲異常和異常處理。每個邏輯快分為三個部分,語法結構如下:
PL/SQL的語法結構
[DECLARE
--declaration statements] 變量或常量聲明部分。可選。
BEGIN
--executable statements 執行部分。BEGIN開始,END結束(加;號)。必須寫。
[EXCEPTION
--exception statements] 異常處理部分。可選。作用於java中異常的作用和機制都一樣。
END;
注意:
- LP/SQL是一種編程語言,有自己獨有的數據類型,變量聲明和賦值以及流程控制語句。
- 對大小寫不敏感,但是為了規范:關鍵字全部大寫,其余部分小寫。
- 每一條語句以分號結束。
PL/SQL特殊符號說明:
三.變量和常量。
聲明變量:
變量名 數據類型[:=初始值];
DECLARE a int; BEGIN select MGR into a from emp where empno=7369; END;
變量名 數據類型 DEFAULT 初始值;
DECLARE b int default 0; BEGIN select MGR into b from emp where empno=7369; END;
聲明普通常量:
常量名 CONSTANT 數據類型 :=常量值;
set serveroutput on; --設置向控制台輸出 DECLARE c CONSTANT int:=666; BEGIN dbms_output.put_line(c); END;
四.PL/SQL數據類型。
- 標量數據類型
前面在建表時,學習過Oracle SQL的數據類型,PL/SQL不但支持這些數據類型,還具備自身的數據類型。如下圖:
- 屬性數據類型
當聲明一個變量的值是數據庫的一行或者是數據庫的某列時,可以直接使用屬性類型來聲明。ORACLE有兩種屬性數據類型:%TYPE和%ROWTYPE
%ROWTYPE
引用數據庫表中的一行作為數據類型,可以使用" . " 來訪問記錄中的屬性。
實例:
set serveroutput on; 結果:
DECLARE EMPNO ENAME SAL myrow EMP%ROWTYPE; 7369 SMITH 800 BEGIN select * into myrow from emp where empno=7369; dbms_output.put_line('EMPNO ENAME SAL'); dbms_output.put_line(myrow.empno||' '||myrow.ename||' '||myrow.sal); END;
%TYPE
引用某個變量或者數據庫的列的類型作為某變量的數據類型。
實例:
set serveroutput on; DECLARE 說明: sal emp.sal%TYPE; mytype NUMBER(4):=1000; 定義sal的數據類型為emp表中sal的數據類型。 sumsal mytype%TYPE; BEGIN select SAL into sal from emp where empno=7499; 定義sumsal的數據類型為mytype的數據類型。 sumsal:=sal+mytype; dbms_output.put_line(sumsal); END;