存儲過程的基本語法
1.基本結構
OR 存儲過程名字
(
參數1 IN ,
參數2 IN
) IS
變量1 :=0;
變量2 DATE;
BEGIN
END 存儲過程名字
2. INTO
將查詢的結果存入到變量中,可以同時將多個列存儲多個變量中oracle存儲過程關鍵字,必須有一條
記錄,否則拋出異常(如果沒有記錄拋出)
例子:
BEGIN
col1,col2 into 變量1,變量2 FROM where xxx;
WHEN THEN
xxxx;
END;
...
3.IF 判斷
IF =1 THEN
BEGIN
do
END;
END IF;
4.while 循環
WHILE =1 LOOP
BEGIN
XXXX
END;
END LOOP;
5.變量賦值
:= 123;
6.用for in 使用
...
IS
cur IS * FROM xxx;
BEGIN
FOR in cur LOOP
BEGIN
V_SUM :=.列名1+.列名2
END;
END LOOP;
END;
7.帶參數的
(C_ID ) IS NAME FROM USER WHERE =C_ID;
OPEN (變量值);
LOOP
FETCH INTO ;
EXIT FETCH %;
do
END LOOP;
CLOSE ;
8.用pl/sql debug
連接數據庫后建立一個Test
在窗口輸入調用SP的代碼,F9開始debug,CTRL+N單步調試
關于存儲過程的若干問題備忘
1.在中,數據表別名不能加as,如:
也許,是怕和中的存儲過程中的關鍵字as沖突的問題吧
2.在存儲過程中,某一字段時,后面必須緊跟into,如果整個記錄,利用游標的話就另當別論了。
3.在利用...into...語法時oracle存儲過程關鍵字,必須先確保數據庫中有該條記錄,否則會報出"no data found"異常。
可以在該語法之前,先利用 count(*) from查看數據庫中是否存在該記錄,如果存在,再利用...into...
4.在存儲過程中,別名不能和字段名稱相同,否則雖然編譯可以通過,但在運行階段會報錯
5.在存儲過程中,關于出現null的問題
假設有一個表A,定義如下:
如果在存儲過程中,使用如下語句:
如果A表中不存在bid=""的記錄,則=null(即使定義時設置了默認值,如: (8):=0依然無效,還是會變成null),這樣以后使用時就可能有問題,所以在這里最好先判斷一下:
這樣就一切ok了。
6.調用存儲過程
存儲過程學習
存儲過程創建語法:
or 存儲過程名( in type, out type)
as
變量1 類型(值范圍);
變量2 類型(值范圍);
Begin
count(*) into 變量1 from 表A where列名=;
If (判斷條件) then
列名 into 變量2 from 表A where列名=;
。(‘打印信息’);
Elsif (判斷條件) then
。(‘打印信息’);
Else
Raise 異常名();
End if;
When then
;
End;
注意事項:
1, 存儲過程參數不帶取值范圍,in表示傳入,out表示輸出
2, 變量帶取值范圍,后面接分號
3, 在判斷語句前最好先用count(*)函數判斷是否存在該條操作記錄
4, 用 。。。into。。。給變量賦值
5, 在代碼中拋異常用 raise+異常名
以命名的異常
命名的系統異常 產生原因
未定義對象
CASE 中若未包含相應的 WHEN ,并且沒有設置
ELSE 時
集合元素未初始化
游標已經打開
唯一索引對應的列上有重復的值
在不合法的游標上進行操作
內嵌的 SQL 語句不能將字符轉換為數字
使用 into 未返回行,或應用索引表未初始化的
執行 into 時,結果集超過一行
除數為 0
元素下標超過嵌套表或 的最大值
使用嵌套表或 時,將下標指定為負數
賦值時,變量長度不足以容納實際數據
PL/SQL 應用程序連接到 數據庫時,提供了不
正確的用戶名或密碼
PL/SQL 應用程序在沒有連接 數據庫的情況下
訪問數據
PL/SQL 內部問題,可能需要重裝數據字典& pl./SQL
系統包
宿主游標變量與 PL/SQL 游標變量的返回類型不兼容
使用對象類型時,在 null 對象上調用對象方法
運行 PL/SQL 時,超出內存空間
無效的 ROWID 字符串