目錄
子程序
命名的PL/SQL塊,能夠接受傳遞的參數,能夠被調用。
子程序的類型:
- 過程:用於執行某項操作
- 函數:用於執行某項操作並返回值
基於標準的PL/ SQL塊結構
- 聲明部分
- 可執行部分
- 異常部分(可選)
存儲過程
- 命名的PL/SQL塊
- 能夠接受參數
- 能夠被重複調用
- 用於執行某項操作
- 存儲在數據庫中
過程
創建過程
語法:
CREATE [OR REPLACE] PROCEDURE procedure name
[(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
...)]
IS|AS
PL/ SQL Block;
參數:和外界打交道的
mode模式有三種:輸入,輸出,既能輸入又能輸出(可省略,默認爲輸入的)
數據類型
過程的參數
IN參數
例子:
CREATE OR REPLACE PROCEDURE raise_ salary
(p_ jid IN emp. empno%TYPE)
IS
BEGIN
UPDATE emp
SET sal = sal* 1.10
WHERE empno= P_ jid;
END raise_ salary;
OUT參數
CREATE OR REPLACE PROCEDURE raise_ sal
(p_ id IN emp.empno%type,
P_ name OUT varchar2,
p_ _sal OUT number)
IS
BEGIN
SELECT sal,ename
INTO p_ sal,p_ name
FROM emp
WHERE empno= p_ _id;
END raise_ _sal;
在調用的時候
DECLARE
V_ sal emp.sal%type;
V_ name emp.ename%type;
BEGIN
raise_ sal(7369, V_ name, V_ sal);
dbms_ output. put line('僱員:'||v_ name || '的薪水是'||v_ sal);
END;
這樣在參數中可以接收返回的值。
IN OUT參數
CREATE OR REPLACE PROCEDURE raise sal
(p_ id IN emp. empno%type,
P_ name OUT varchar2,
p_ sal IN OUT number)
IS
BEGIN
UPDATE emp
SET sal=sal+p__sal
WHERE empno=p_ id;
SELECT sal,ename into p_ sal,p_ name
FROM emp
WHERE empno= p_ id;
END raise_ sal;
調用示例
DECLARE
V_ sal emp.sal%type := 500;
V_ name emp.ename%type;
BEGIN
raise_ sal(7369, V_ name, V_ sal);
dbms_ output.put_ line('僱員:'||v_ name||'的薪水是'||v_ sal);
END;
既然能輸入能輸出,就應該傳一個已經初始化的變量。
參數傳遞方法
三種參數傳遞方法:
- 位置:實際參數與形式參數排列的順序相同
- 指定:實際參數聯合其相應的形式參數以任意順序排列
- 組合:實際參數的排列- -些用位置,一些用指定
位置法:實參與形參順序相同,順序不同會報錯
指定法:形參名字=>實參名字
例
get_ annual income(P_ empho=>7369,P_ ann_ sal=>v_ ann_ sal)
這樣就可以不考慮順序了
組合法是兩種的綜合
get_ annual_ income(P_ empno=>7369,V_ ann sal);//錯誤
get_ annual_ income(V_ ann sal,P_ empno=>7369) ;//正確
前面有按照名字的位置就已經不準確了,所以要先按照位置再按照名字