PL/SQL存儲過程
存儲過程相當於一個有名字的PL/SQL塊,經過第一次編譯后再次調用時不需要再次編譯
創建格式:
CREATE [OR REPLACE] PROCEDURE proc_name [list of parameters]
IS
Declaration section
BEGIN
Execution section
EXCEPTION
Exception section
END;
返回值:
可有可沒有
例子:
1> CREATE OR REPLACE PROCEDURE employer_details
2> IS
3> CURSOR emp_cur IS
4> SELECT first_name, last_name, salary FROM emp_tbl;
5> emp_rec emp_cur%rowtype;
6> BEGIN
7> FOR emp_rec in sales_cur
8> LOOP
9> dbms_output.put_line(emp_cur.first_name || ' ' ||emp_cur.last_name
10> || ' ' ||emp_cur.salary);
11> END LOOP;
12>END;
13> /
執行:
1) EXECUTE [or EXEC] procedure_name;
2) 在另一個存儲過程里面時: procedure_name;
PL/SQL函數
函數和存儲過程最大的
區別是:函數必須有返回值。
創建語法:
CREATE [OR REPLACE] FUNCTION function_name [parameters]
RETURN return_datatype;
IS
Declaration_section
BEGIN
Execution_section
Return return_variable;
EXCEPTION
exception section
Return return_variable;
END;例子:
1> CREATE OR REPLACE FUNCTION employer_details_func
2> RETURN VARCHAR(20);
3> IS
5> emp_name VARCHAR(20);
6> BEGIN
7> SELECT first_name INTO emp_name
8> FROM emp_tbl WHERE empID = '100';
9> RETURN emp_name;
10> END;
11> /
執行:
1) employee_name := employer_details_func;(給變量賦值)
2) SELECT employer_details_func FROM dual;(作為查詢語句一部分)
3) dbms_output.put_line(employer_details_func);(PL/SQL里使用)
PL/SQL存儲過程和函數中的參數
1) IN-parameters
默認參數類型,相當於一般編程語言里的函數參數,只讀,不能改變其值。
用法:
CREATE [OR REPLACE] PROCEDURE procedure_name(param_name1 [IN] datatype)
2) OUT-parameters
只寫,不可以用其值,但是可為其指定值。
用法:
CREATE [OR REPLACE] PROCEDURE procedure_name(param_name OUT datatype)
3) IN OUT-parameters
可讀可寫
用法:
CREATE [OR REPLACE] PROCEDURE procedure_name(param_name IN OUT datatype)
例1:
創建一個有IN和OUT參數的存儲過程
1> CREATE OR REPLACE PROCEDURE emp_name (id IN NUMBER, emp_name OUT NUMBER)
2> IS
3> BEGIN
4> SELECT first_name INTO emp_name
5> FROM emp_tbl WHERE empID = id;
6> END;
7> /
在PL/SQL塊中調用emp_name存儲過程.
1> DECLARE
2> empName varchar(20);
3> CURSOR id_cur SELECT id FROM emp_ids;
4> BEGIN
5> FOR emp_rec in id_cur
6> LOOP
7> emp_name(emp_rec.id, empName);
8> dbms_output.putline('The employee ' || empName || ' has id ' || emp-rec.id);
9> END LOOP;
10> END;
11> /
例2:
創建一個有IN OUT參數的存儲過程
1> CREATE OR REPLACE PROCEDURE emp_salary_increase
2> (emp_id IN emptbl.empID%type, salary_inout IN OUT emptbl.salary%type)
3> IS
4> tmp_sal number;
5> BEGIN
6> SELECT salary
7> INTO tmp_sal
8> FROM emp_tbl
9> WHERE empID = emp_id;
10> IF tmp_sal between 10000 and 20000 THEN
11> salary_inout := tmp_sal * 1.2;
12> ELSIF tmp_sal between 20000 and 30000 THEN
13> salary_inout := tmp_sal * 1.3;
14> ELSIF tmp_sal > 30000 THEN
15> salary_inout := tmp_sal * 1.4;
16> END IF;
17> END;
18> /
在PL/SQL塊中調用emp_salary_increase存儲過程.
1> DECLARE
2> CURSOR updated_sal is
3> SELECT empID,salary
4> FROM emp_tbl;
5> pre_sal number;
6> BEGIN
7> FOR emp_rec IN updated_sal LOOP
8> pre_sal := emp_rec.salary;
9> emp_salary_increase(emp_rec.empID, emp_rec.salary);
10> dbms_output.put_line('The salary of ' || emp_rec.empID ||
11> ' increased from '|| pre_sal || ' to '||emp_rec.salary);
12> END LOOP;
13> END;
14> /