存儲(chǔ)過程:一段存儲(chǔ)在數(shù)據(jù)庫(kù)中執(zhí)行某種功能的程序,使用存儲(chǔ)過程可以簡(jiǎn)化復(fù)雜的操作、增加數(shù)據(jù)的安全性、提高程序的性能.
一、存儲(chǔ)過程的組成結(jié)構(gòu)
create [or replace] procedure procedure_name
(
param_desc1,
param_desc2
...
)
{is | as}
PL/SQL塊
or replace:覆蓋同名存儲(chǔ)過程
procedure_name:存儲(chǔ)過程的名稱
param_desc:存儲(chǔ)過程所需參數(shù),有3類:輸入?yún)?shù)(默認(rèn))(in)、輸出參數(shù)(out)、輸入輸出參數(shù)(in out)
datatype:返回值的數(shù)據(jù)類型
PS:創(chuàng)建存儲(chǔ)過程需要有 CREATE PROCEDURE 權(quán)限.
二、示例
1、不帶參數(shù)的存儲(chǔ)過程
create or replace procedure my_pro1
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(systimestamp);
END my_pro1;
存儲(chǔ)過程不需要外部數(shù)據(jù),就可以沒有參數(shù).
2、帶 in 參數(shù)的存儲(chǔ)過程
create or replace procedure my_pro2
(
p_pid VARCHAR2,
p_name VARCHAR2,
p_price NUMBER,
p_cid VARCHAR2 DEFAULT '1'
)
IS
BEGIN
INSERT INTO product(pid, NAME, price, cid)
VALUES(p_pid, p_name, p_price, p_cid);
COMMIT;
END my_pro2;
存儲(chǔ)過程中需要外部數(shù)據(jù),就需要有輸入?yún)?shù).
3、帶 out 參數(shù)的存儲(chǔ)過程
create or replace procedure my_pro3
(
p_pid IN VARCHAR2,
p_name OUT VARCHAR2
)
IS
BEGIN
SELECT p.name INTO p_name FROM product p
WHERE p.pid = p_pid;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('沒有該pid的商品');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('返回?cái)?shù)據(jù)超過一行');
END my_pro3;
存儲(chǔ)過程中需要輸出數(shù)據(jù)時(shí),可以使用 out 參數(shù).
4、帶 in out 參數(shù)的存儲(chǔ)過程
create or replace procedure my_pro4
(
v_num1 IN OUT NUMBER,
v_num2 IN OUT NUMBER
)
IS
BEGIN
v_num1 := v_num1 - v_num2;
v_num2 := v_num1 + v_num2;
DBMS_OUTPUT.PUT_LINE('差是:'||v_num1);
DBMS_OUTPUT.PUT_LINE('和是:'||v_num2);
END my_pro4;
一個(gè)參數(shù)既是輸入?yún)?shù),又是輸出參數(shù),就可以定義為 in out .
三、調(diào)用存儲(chǔ)過程
1、不帶參數(shù)的存儲(chǔ)過程
2、帶 in 參數(shù)的存儲(chǔ)過程
方式1:
BEGIN
my_pro1;
my_pro2('13', 'GTX 1050Ti', 1000, '1');
END;
方式2:使用 EXEC 命令
exec my_pro1;
exec my_pro2('12', 'GTX 940M', 666.66, '1');
3、帶 out 參數(shù)的存儲(chǔ)過程
4、帶 in out 參數(shù)的存儲(chǔ)過程
調(diào)用有輸出參數(shù)的存儲(chǔ)過程,必須傳入變量接受輸出參數(shù)的數(shù)據(jù)
DECLARE
v_name VARCHAR(20);
v_num1 NUMBER := 666;
v_num2 NUMBER := 111;
BEGIN
my_pro3('1', v_name);
DBMS_OUTPUT.PUT_LINE(v_name);
my_pro4(v_num1, v_num2);
END;
四、存儲(chǔ)過程的修改、刪除
存儲(chǔ)過程的修改:使用 replace 關(guān)鍵字
存儲(chǔ)過程的刪除:drop procedure procedure _name
五、存儲(chǔ)過程與函數(shù)的區(qū)別
區(qū)別在于:函數(shù)可以有一個(gè)返回值,而存儲(chǔ)過程沒有,但是存儲(chǔ)過程與函數(shù)又都可以通過 out、in out 指定一個(gè)或多個(gè)輸出參數(shù),實(shí)現(xiàn)返回多個(gè)值.