金仓数据库oracle模式下的in out inout三种参数模式

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,  -- IN by default
  b     IN int,
  c    OUT int,
  d IN OUT int
) IS
BEGIN
  -- Print values of parameters:
  raise notice 'a = %', a;
  raise notice 'b = %', b;
  raise notice 'c = %', c;
  raise notice 'd = %', d;
 
  -- Can reference IN parameters a and b,
  -- but cannot assign values to them.
 
  c := a+10;  -- Assign value to OUT parameter
  d := 10/b;  -- Assign value to IN OUT parameter
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, -- constant
     bb, -- initialized variable
     cc, -- initialized variable 
     dd  -- initialized variable
  );
 
  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,        -- literal 
     (bb+3)*2, -- expression 
     ee,       -- uninitialized variable 
     ff        -- initialized variable
   );
 
  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

【更多人大金仓数据库信息, 详见 金仓文档管理系统

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值