关键字:
KingbaseES、IN、OUT、INOUT、人大金仓
存储过程的三种参数类型
- 什么是参数:
参数是一种向程序单元输入和输出数据的机制,存储过程可以接收多个参数
- 参数模式分类:
IN参数: 输入参数,只能接收参数,不能修改(可以传入一个具体的值,也可以传入一个变量)。
OUT参数:输出参数,用于输出值,会忽略传入的值,可修改并将参数值传递到当前存储过程以外的环境中(实参就只能是一个变量,不可以是具体的值)。
INOUT参数:兼容以上两种特性,能接收传入的实参值,在子程序内可修改,也可以输出(实参就只能是一个变量,不可以是具体的值)。
三种参数类型的使用示例对比说明
示例1:只有IN参数的存储过程 – 传入具体值时
CREATE OR REPLACE PROCEDURE pr1(p1 int) AS
a1 int :=10;
BEGIN
a1 :=a1+p1;
RAISE NOTICE '%', a1;
END;
/
DECLARE
v1 int :=12;
BEGIN
pr1(10);
pr1(v1);
RAISE NOTICE '%',v1;
END;
/
执行结果:
示例2:只有IN参数的存储过程 – 传入变量时
CREATE OR REPLACE PROCEDURE pr1(p1 int) AS
a1 int :=10;
BEGIN
a1 :=a1+p1;
RAISE NOTICE '%', a1;
END;
/
DECLARE
v1 int;
BEGIN
pr1(v1);
RAISE NOTICE '%',v1;
END;
/
执行结果:
总结:根据上面的例子可知,当我们不该参数指定类型时会默认为IN类型。
同时也验证了,IN类型的参数既可以传入值也可以传入变量。
示例3:有OUT参数的存储过程 — 传入具体值时
CREATE OR REPLACE PROCEDURE pr2(p1 OUT int) AS
a1 int :=10;
BEGIN
a1 :=a1+p1;
RAISE NOTICE '%', a1;
END;
/
DECLARE
BEGIN
pr2(10);
END;
/
执行结果:
示例4:有OUT参数的存储过程 — 传入变量时
CREATE OR REPLACE PROCEDURE pr1(p1 int,p2 out int) AS
a1 int :=10;
BEGIN
a1 :=a1+p1;
p2 :=a1;
END;
/
DECLARE
v1 int;
BEGIN
pr1(10,v1);
RAISE NOTICE '%',v1;
END;
/
执行结果:
总结:根据上面的例子可知,当给out类型的参数传递具体的值时,程序会报错无法调用存储过程,当给out类型的参数传的是变量时程序可以正常之执行,证明了实参就只能是一个变量,不可以是具体的值。同时,通过该out类型将存储过程内部的值输出到了外面。
示例5:有INOUT参数的存储过程 — 传入值时
CREATE OR REPLACE PROCEDURE pr2(p1 INOUT int) AS
a1 int :=10;
BEGIN
a1 :=a1+p1;
RAISE NOTICE '%', a1;
END;
/
DECLARE
BEGIN
pr2(10);
END;
/
执行结果:
示例6:有INOUT参数的存储过程 — 传入参数时
CREATE OR REPLACE PROCEDURE pr1(p1 int,p2 in out int) AS
a1 int :=10;
BEGIN
a1 :=a1+p1;
p2 :=a1;
END;
/
DECLARE
v1 int;
BEGIN
pr1(10,v1);
RAISE NOTICE '%',v1;
END;
/
执行结果:
总结:根据上面的例子可知,当给inout类型的参数传递具体的值时,程序会报错无法调用存储过程,当给inout类型的参数传的是变量时程序可以正常之执行,证明了实参就只能是一个变量,不可以是具体的值。同时,通过该inout类型将存储过程内部的值输出到了外面。