SELECT COL1
INTO變數名
FROM TABLE1;
注:這種賦值方法要求TABLE1表中有且僅有一條記錄。否則將報錯。
3)程式塊式結構:DECLARE
變數說明部分;
BEGIN
執行語句部分;
[EXCEPTION
例外處理部分;]
END;
4)控制語句:分支語句:
IF condition THEN
Sequence_of_statements;
END IF;
IF condition THEN
Sequence_of_statement1;
ELSE
Sequence_of_statement2;
END IF;
IF condition1 THEN
Sequence_of_statement1;
ELSIF condition2 THEN
Sequence_of_statement2;
ELSIF condition3 THEN
Sequence_of_statement3;
END IF;
5) 控制語句:迴圈語句:
LOOP
Sequence_of_statements;
IF condition THEN
EXIT;
END IF;
END LOOP;
WHILE condition LOOP
Sequence_of_statements;
END LOOP;
FOR counter IN lower_bound..higher_bound LOOP
Sequence_of_statements;
END LOOP;
6)數組的聲明PL/SQL表與其他過程化語言(如C語言)的一維數組類似。實現PL/SQL表需要建立一個資料類型並另外進行變數說明,不需要事先定義數組大小。
Type <類型名> Is
Table Of <資料類型>
Index by Binary_Integer;
以下為一個例子:
Declare
Type Array_type is
Table Of Number
Index by Binary_Integer; --數群組類型的聲明
My_Array Array_type; --陣列變數的定義
Begin
For I In 1..10 Loop
My_Array(I) := I*2; --數組的初始化
End Loop;
For I In 1..10 Loop
DBMS_OUTPUT.Put_line(To_char(My_Array(I)));
End Loop;
End;
7)EXCEPTION處理文法:
WHEN 異常類型1 THEN
STATEMENTS;
WHEN異常類型2 THEN
STATEMENTS;
.....
WHEN OTHERS THEN
STATEMENTS;
每個WHEN 語句指一個異常處理。OTHER語句允許定義其他WHEN語句沒有定義的異常處理。在一個塊語句中只允許有一個WHEN OTHERS語句。.
可以使用SQLCODE函數查看異常值。
使用SQLERRM函數查看異常資訊。
使用RAISE_APPLICATION_ERR(錯誤號碼,錯誤訊息);函數可以在EXCEPTION中使用自訂的異常來替換系統異常。
8)自訂ORACLE錯誤碼名稱:oracle錯誤碼有幾百個,但只有最常用的幾十個有名稱.可以給oracle錯誤碼起名
例:
DECLARE
BAD_ROWID EXCEPTION;
X ROWID;
PRAGMA EXCEPTION_INIT(BAD_ROWID,-01445);
--錯誤號碼” -01445”被命名為(BAD_ROWID
BEGIN
SELECT ROWID INTO X FROM TAB
WHERE ROWNUM=1;
EXCEPTION
WHEN BAD_ROWID THEN
DBMS_OUTPUT.PUT_LINE('CANNOT QUERY ROWID FROM THIS VIEW');
END;
注意:-01445 因為PRAGMA EXCEPTION_INIT命令把這個變數(-01455)串連到這個ORACLE錯誤,該語句的文法如下:
PRAGMA EXCEPTION_INIT(exception_name, error_number);
其中error_number是負數,因為錯誤號碼被認為負數,當定義錯誤時記住使用負號
9) 自訂異常異常不一定必須是oracle返回的系統錯誤,使用者可以在自己的應用程式中建立可觸發及可處理的自訂異常.
DECLARE
SALARY_CODE VARCHAR2(1);
INVALID_SALARY_CODE EXCEPTION;--自訂異常
BEGIN
SALARY_CODE:='X';
IF SALARY_CODE NOT IN('A', 'B', 'C') THEN
RAISE INVALID_SALARY_CODE;--啟用異常
END IF;
EXCEPTION
WHEN INVALID_SALARY_CODE THEN
DBMS_OUTPUT.PUT_LINE('INVALID SALARY CODE');
END;
二、遊標(CURSOR)屬性 含量
%FOUND 布爾型屬性,當最近一次該記錄時成功返回,則值為TRUE
%NOTFOUND 布爾型屬性,它的值總與%FOUND屬性的值相反
%ISOPEN 布爾型屬性,當游標是開啟時返回TRUE
%ROWCOUNT 數字型屬性,返回已從游標中讀取的記錄數
遊標(CURSOR)是指向一個稱為上下文相關區的地區的指標,這個地區在伺服器的處理過程全域區(PGA)內,當伺服器上執行了一個查詢後,查詢返回的記錄集存放在上下文相關區,通過遊標上的操作可以把這些記錄檢索到用戶端的應用程式。
1) 使用游標的基本方法DECLARE
CURSOR A83D861_cur IS
SELECT ankKaisha ,ankManno ,
FROM A83D861;-- 游標定義
A83D861_rectype A83D861_cur%ROWTYPE ;--定義游標類型的變數
BEGIN
OPEN A83D861_cur ;--開啟游標
LOOP
FETCH A83D861_cur INTO A83D861_rectype ;--取記錄
或者 FETCH A83D861_cur INTO lv_ankKaisha ,lv_ankManno;
EXIT WHEN A83D861_cur%NOTFOUND ;
--記錄取完退出loop迴圈
…………處理語句
END LOOP ;
CLOSE A83D861_cur ;--關閉游標
或者
FOR C_ A83D861_cur IN A83D861_cur LOOP
C_ A83D861_cur.COL1….
END LOOP;
END;
C_ A83D861_cur不用聲明,它被隱式聲明.三、預存程序,函數,包,子程式:
預存程序,函數,包在ORACLE中被視為子程式.編譯後被放入ORACLE資料字典中,使用者可直接調用.
1)預存程序:建立文法
CREATE [OR REPLACE]PROCEDURE 過程名 (in|out參數說明1,in|out參數說明2,。。。) IS
[局部說明]
BEGIN
執行語句;
[EXCEPTION
例外處理; ]
END 過程名;
2)函數:建立文法
CREATE [OR REPLACE]FUNCTION 函數名 (參數說明1,參數說明2,。。。)
RETURN 類型 IS
[局部說明]
BEGIN
執行語句;
RETURN(傳回值);
[EXCEPTION
例外處理; ]
END 函數名;
在例外處理中也要有RETURN語句存在,否則主調語句會報”沒有傳回值”的錯誤.
如果是要求返回一個CURSOR,需要先定義
TYPE g_grp_cur is REF CURSOR;
FUNCTION SP_SEARCH()
RETURN g_grp_cur
AS
o_grp_cur g_grp_cur;
BEGIN
OPEN o_grp_cur FOR
(SQL語句);
RETURN o_grp_cur;
END SP_SEARCH;
不論在過程還是函數中均可再套用SQL語句塊.
例:
FUNCTION SP_ADD()
RETURN VARCHAR2
AS
BEGIN
…………….
DECLARE
A INTEGER := 0;
BEGIN
NULL;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
……………
RETURN ‘AAA’;
END SP_ADD;
3)包是被封裝到單獨一個單元的一組過程,函數,變數,SQL語句。包定義中聲明的變數屬於全域變數.只在包體中聲明的過程,函數為該包的私人函數.如果包中函數A調用包中函數B,則B必須先於A聲明,否則報錯.包內過程,函數支援重載, 重載同JAVA.
在包定義中聲明的函數必須在包體中實現.
包類似與C的INCLUDE檔案。使用包可以使程式變得模組化且易於管理.
建立文法,分為兩個部分
包定義部分
CREATE [OR REPLACE]PACKAGE 包名
{IS|AS}
SQL語句;
E