存储过程:一段存储在数据库中执行某种功能的程序,使用存储过程可以简化复杂的操作、增加数据的安全性、提高程序的性能.
一、存储过程的组成结构
create [or replace] procedure procedure_name
(
param_desc1,
param_desc2
...
)
{is | as}
PL/SQL块
or replace:覆盖同名存储过程
procedure_name:存储过程的名称
param_desc:存储过程所需参数,有3类:输入参数(默认)(in)、输出参数(out)、输入输出参数(in out)
datatype:返回值的数据类型
PS:创建存储过程需要有 CREATE PROCEDURE 权限.
二、示例
1、不带参数的存储过程
create or replace procedure my_pro1
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(systimestamp);
END my_pro1;
存储过程不需要外部数据,就可以没有参数.
2、带 in 参数的存储过程
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;
存储过程中需要外部数据,就需要有输入参数.
3、带 out 参数的存储过程
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('返回数据超过一行');
END my_pro3;
存储过程中需要输出数据时,可以使用 out 参数.
4、带 in out 参数的存储过程
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;
一个参数既是输入参数,又是输出参数,就可以定义为 in out .
三、调用存储过程
1、不带参数的存储过程
2、带 in 参数的存储过程
方式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 参数的存储过程
4、带 in out 参数的存储过程
调用有输出参数的存储过程,必须传入变量接受输出参数的数据
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;
四、存储过程的修改、删除
存储过程的修改:使用 replace 关键字
存储过程的删除:drop procedure procedure _name
五、存储过程与函数的区别
区别在于:函数可以有一个返回值,而存储过程没有,但是存储过程与函数又都可以通过 out、in out 指定一个或多个输出参数,实现返回多个值.