Oracle的inout参数模式
Oracle中存储过程与函数都可以有参数,参数的类型可以指定为in、out、in out三种模式。 IN :用于传入参数 在调用过程的时候,实参传到该过程中 在过程内部,形参会被看做只读且不能更改的 在过程执行完毕,返回调用环境时候,实参到的值也不会改变 OUT:用于返回值 在调用过程时候,会忽略传入的形参的值,形参像未初始化的变量,值为null 形参可以读取和写入 在过程执行之后,返回调用环境(只有程序正常结束时),会将形参赋值给实参 IN OUT: 用于传入参数和返回值 在调用过程的时候,实参值会传递到过程中 在过程执行之后,返回调用环境(只有程序正常结束时),会将形参复制给实参
金仓数据库的inout参数模式
金仓数据库为了兼容oracle,在oracle模式下支持IN、OUT、IN OUT 三种参数模式: 官方的文档描述如下: KingbaseES 存储过程和函数提供了 IN、OUT、IN OUT 三种参数模式,分别对应输入、输出、输入输出三种语义。 IN参数将值传给被调用的子程序; OUT/INOUT参数调用时需传入变量,调用后实参变量的值将被修改。不声明参数模式时,缺省为 IN 类型。 KingbaseES支持模式的参数与主流的数据库和 SQL 的标准规范相比,KingbaseES 与他们的差别如下: 下面通过实例去了解
1、in参数模式
不指定时,默认是IN参数模式,支持赋值创建 函数同存储过程表现一致,用函数举例
create or replace function in_t000(i int) return void as
begin
i = i + 1;
raise notice 'i = %', i;
end;
通过匿名块进行调用,查看结果 从以上函数示例可以看出: 1、在调用函数的时候,实参传到该函数中 2、在函数内部,形参只读且不能更改 3、在函数执行完毕,返回调用环境时候,实参到的值也不会改变(k=1) 同oracle表现一致
in参数还支持不赋值创建,
create or replace function in_t000(i int) return void as
begin
raise notice 'i = %', i;
end;
通过匿名块进行调用,查看结果
2、out参数模式
out参数:调用方式需传参数(会忽略传入的值)、支持修改实参的值、支持独立返回值
create or replace procedure out_t000(j out int) as
begin
raise notice 'j = %', j;
j := 10;
end;
/
通过匿名块进行调用 从以上示例可以看出: 在调用过程时候,会忽略传入的形参的值,形参像未初始化的变量,值为null(j = ) 形参可以读取和写入 在过程执行之后,返回调用环境(只有程序正常结束时),会将形参赋值给实参(k = 10)
3、inout参数模式
in out参数:调用方式需传参数、支持修改实参的值、支持独立返回值
create or replace function inout_t001(i in out text) return int as
begin
raise notice 'i = %', i;
i := 't000';
raise notice 'i = %', i;
return 1;
end;
4、合并示例:
创建存储过程p,包含2个in参数,1个out参数和1个in参数,过程p通过不同的实际参数调用两次,在每次调用之前都会打印实际参数的值,每次调用之后再次打印实际参数的值
CREATE OR REPLACE PROCEDURE p (
a int,
b IN int,
c OUT int,
d IN OUT int
) IS
BEGIN
raise notice 'a = %', a;
raise notice 'b = %', b;
raise notice 'c = %', c;
raise notice 'd = %', d;
c := a+10;
d := 10/b;
END;
/
通过匿名块调用
DECLARE
aa CONSTANT int := 1;
bb int := 2;
cc int := 3;
dd int := 4;
ee int;
ff int := 5;
BEGIN
raise notice 'aa = %', aa;
raise notice 'bb = %', bb;
raise notice 'cc = %', cc;
raise notice 'dd = %', dd;
p (aa,
bb,
cc,
dd
);
raise notice 'aa = %', aa;
raise notice 'bb = %', bb;
raise notice 'cc = %', cc;
raise notice 'dd = %', dd;
raise notice 'ee = %', ee;
raise notice 'ff = %', ff;
p (1,
(bb+3)*2,
ee,
ff
);
raise notice 'ee = %', ee;
raise notice 'ff = %', ff;
END;
/
执行结果如下,此表现同oracle一致: NOTICE: aa = 1 NOTICE: bb = 2 NOTICE: cc = 3 NOTICE: dd = 4 NOTICE: a = 1 NOTICE: b = 2 NOTICE: c = NOTICE: d = 4 NOTICE: aa = 1 NOTICE: bb = 2 NOTICE: cc = 11 NOTICE: dd = 5 NOTICE: ee = NOTICE: ff = 5 NOTICE: a = 1 NOTICE: b = 10 NOTICE: c = NOTICE: d = 5 NOTICE: ee = 11 NOTICE: ff = 1 ANONYMOUS BLOCK
【更多人大金仓数据库信息, 详见 金仓文档管理系统 】
|