文章概要:

本文对主要就KES和Oracle的PLSQL中关于存储过程参数模式异同进行介绍,列举和验证了存在的差异

(如果想直接看差异的结论可直接跳到末尾)。

一,存储过程的三种参数模式

重新回顾一下,PLSQL中存储过程的三种参数模式IN、OUT、INOUT

1,IN参数模式,也是默认的模式,在存储过程运行的时候就应该具有值

2,OUT参数模式,定义的参数只能在存储过程体内部赋值,表示该参数可以将某个值传递到外部调用处。

3,IN OUT简单来说就是存储过程调用处传递的实参,在过程体内会被接收到,并且在存储过程体内为形参赋的值也会被传递到存储过程调用处。

二,IN模式

共同点:

1,IN模式是参数的默认模式,且可以不写IN,

2,应该在程序运行的时候已经具有值

3,可以设置默认值

差异点:

Oracle--》参数不可以在程序体内重新赋值,即只能传入给程序使用

KES-----》参数可以在程序体内重新赋值

对差异点进行验证

--测试用例1:

--存储过程in_proc
create or replace procedure in_proc (
p_a in number ,
p_b number --默认为IN模式
)as
begin
p_a := 10 ; --实参被传递进来以后,在这个程序体中Oracle不支持修改,KES支持修改
p_b := 20 ;
dbms_output.put_line(p_a);
dbms_output.put_line(p_b);
end ;
--测试存储过程
declare
va int;
vb int;
begin
va := 11;
vb := 12;
call in_proc(va,vb);
end

--oracle编译存储过程直接报错:

Procedure IN_PROC 已编译

LINE/COL  ERROR

--------- -------------------------------------------------------------

6/5       PLS-00363: 表达式 'P_A' 不能用作赋值目标
6/5 PL/SQL: Statement ignored
7/5 PLS-00363: 表达式 'P_B' 不能用作赋值目标
7/5 PL/SQL: Statement ignored
错误: 查看编译器日志

--KES结果,正常输出:

test:=#  declare
test-# va int;
test-# vb int;
test-# begin
test-# va := 11;
test-# vb := 12;
test-# call in_proc(va,vb);
test-# end
test-# /
ANONYMOUS BLOCK
10
20
test:=#

三,OUT模式

共同点:

1,OUT模式必须有OUT关键字,不可以省略

2,只能在程序体内赋值(可以在调用层赋值,但是对程序内外都没有意义,见下例子2)

差异点1:(见下例子3)

Oracle--》OUT和IN OUT参数都不具有默认值。

KES-----》默认情况下OUT和IN OUT参数也都不具有默认值。但是可以开启set comp_v7_program_para_def := on来实现

差异点2:(见下例子4)

Oracle--》必须用实参变量调用

KES-----》非必须用实参变量调用(如果传一个常量也没有意义)

--测试用例2:

--存储过程out_proc
create or replace procedure out_proc (
p_a number ,
p_b OUT number
)as
begin
p_b := 20 ;
dbms_output.put_line(p_a);
dbms_output.put_line(p_b);
end ; --测试存储过程
declare
va int;
vb int;
begin
va := 11;
vb := 12;
out_proc(va,vb);
dbms_output.put_line(vb);
end;

oracle结果

11
20
20 PL/SQL 过程已成功完成。

KES运行结果

test:=#  declare
test-# va int;
test-# vb int;
test-# begin
test-# va := 11;
test-# vb := 12;
test-# out_proc(va,vb);
test-# dbms_output.put_line(vb);
test-# end
test-# /
ANONYMOUS BLOCK
11
20
20
test:=#

效果一致

--测试用例3:

--开启GUC参数
test:=# set comp_v7_program_para_def := on
test-# /
SET create or replace procedure out_proc01 (
p_a number ,
p_b OUT number := 10
)as
begin
dbms_output.put_line(p_a);
p_a := 10 ; --实参被传递进来以后,在这个程序体中Oracle不支持修改,KES支持修改
dbms_output.put_line(p_a);
dbms_output.put_line(p_b);
end ; --测试存储过程
declare
va int;
vb int;
begin
va := 11;
out_proc01(va);
dbms_output.put_line(vb);
end

----oracle测试结果(OUT 和 IN OUT 的形参不能有默认值)

Procedure OUT_PROC01 已编译

LINE/COL  ERROR

--------- -------------------------------------------------------------

3/2       PLS-00230: OUT 和 IN OUT 的形参不能有默认表达式
7/2 PL/SQL: Statement ignored
7/2 PLS-00363: 表达式 'P_A' 不能用作赋值目标
错误: 查看编译器日志

----kes测试结果

test:=#  --测试存储过程
test:=# declare
test-# va int;
test-# vb int;
test-# begin
test-# va := 11;
test-# out_proc01(va);
test-# dbms_output.put_line(vb);
test-# end
test-# /
ANONYMOUS BLOCK
11
10
10
--这里有个NULL值
test:=#

--测试用例4:

--存储过程继续沿用测试用例2中的
--测试存储过程
declare
va int;
vb int;
begin
va := 11;
out_proc(va,15);
dbms_output.put_line(vb);
end

---oracle运行结果(调用报错,实参不能是常量)

在行: 299 上开始执行命令时出错 -
declare
va int;
vb int;
begin
va := 11;
out_proc(va,15);
dbms_output.put_line(vb);
end;
错误报告 -
ORA-06550: 第 6 行, 第 14 列:
PLS-00363: 表达式 'TO_NUMBER(SQLDEVBIND1Z_1)' 不能用作赋值目标
ORA-06550: 第 6 行, 第 2 列:
PL/SQL: Statement ignored 6550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

---KES运行结果

test:=# --测试存储过程
test:=# declare
test-# va int;
test-# vb int;
test-# begin
test-# va := 11;
test-# out_proc(va,15);
test-# dbms_output.put_line(vb);
test-# end
test-# /
ANONYMOUS BLOCK
11
20
--为NULL,说明OUT模式传一个常量没有实际意义
test:=#

四,IN OUT模式

IN OUT模式相比于OUT模式,

新增的差异点:

KES:支持INOUT和IN OUT两种写法,而ORACLE只支持IN OUT写法。

其他的异同则和OUT模式一样。

create or replace procedure inout_proc (
p_a number ,
p_b INOUT number --oracle不知此这种写法
)
as
begin
dbms_output.put_line(p_a);
dbms_output.put_line(p_b);
p_b := 20;
end ; --测试存储过程
declare
va int;
vb int;
begin
va := 11;
vb := 21;
inout_proc(va,vb);
dbms_output.put_line(vb);
end

--KES输出结果

ANONYMOUS BLOCK
11
21
20
test=#

oracle则无法编译通过inout_proc

五,小结

从上面的各节来看,Oracle的语法以及功能限制更为严格和苛刻,而KES的语法形式更为灵活多样,KES在兼容ORACLE的

所有参数模式功能外,还存在着一些差异,一次性罗列差异如下:

1,对于IN模式而言,KES的参数可以在程序体内重新赋值,而ORACLE则不行,即只能传入给程序使用

2,OUT和IN OUT参数ORACLE都不具有默认值,而KES默认也是如此,但是可以通过comp_v7_program_para_def配置为ON

解除该限制

3,OUT模式的形参ORACLE必须要求使用实参变量调用,而KES则不强制,尽管用一个常量实测没什么意义。

4,KES支持INOUT和IN OUT两种写法,而ORACLE只支持IN OUT写法。

Kingbase ES函数参数模式与Oracle的异同的更多相关文章

  1. Oracle过程及函数的参数模式,In、out、in out模式

    Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...

  2. Oracle过程及函数的参数模式详解

    一.In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: (1)in模式 in模式是引用传 ...

  3. 深入理解javascript函数系列第二篇——函数参数

    × 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...

  4. Java 函数参数传递方式详解 分类: Java Game 2014-08-15 06:34 82人阅读 评论(0) 收藏

    转:http://zzproc.iteye.com/blog/1328591 在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式:  A. 是按值传递的?  B. ...

  5. Java函数参数传递方式详解

    在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简 ...

  6. TensorFlow卷积网络常用函数参数详细总结

    卷积操作 tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) 除去name参数用以指定该操作 ...

  7. python学习day10 函数Ⅱ(参数&作用域)

    函数Ⅱ(参数&作用域) 知识小结: py2与py3的区别 逻辑运算()>not>and>or 字符串翻转切片翻转 is与==区别 git相关 数据类型判断 操作系统:cent ...

  8. Day8 函数指针做函数参数

    课堂笔记 课程回顾         多态 virtual关键字 纯虚函数 virtual func() = 0;         提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...

  9. JavaScript进阶系列04,函数参数个数不确定情况下的解决方案

    本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...

  10. JavaScript进阶系列01,函数的声明,函数参数,函数闭包

    本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...

随机推荐

  1. 基于keras的残差网络

    1 前言 理论上,网络层数越深,拟合效果越好.但是,层数加深也会导致梯度消失或梯度爆炸现象产生.当网络层数已经过深时,深层网络表现为"恒等映射".实践表明,神经网络对残差的学习比对 ...

  2. Android使用SurfaceView实现签名板

    SurfaceView使用 首先创建一个SurfaceViewSign类,继承SurfaceView类,继承 SurfaceHolder.Callback和Runnable接口,代码如下: impor ...

  3. libmatio开发笔记(一):matlab文件操作libmatio库介绍,编译和基础Demo

    前言   Qt可通过matlab的库对mat文件进行读写,第三方库matio也可以对mat文件进行读写,其已经支持mat文件的7.3版本.   libmatio库介绍   matio软件包含一个用于读 ...

  4. 正则表达式re模块---day18

    1.匹配单个字符 import re lst = re.findall(正则表达式,要匹配的字符串) 返回的是列表,按照正则表达式匹配到的内容都扔到列表中 # ### 1.预定义字符集 # \d 匹配 ...

  5. python模块imghdr-----推测图像类型

    官方文档 https://docs.python.org/zh-cn/3/library/imghdr.html#module-imghdr 用处 模块推测文件或字节流中的图像的类型 imghdr.w ...

  6. VMware虚拟机Ubuntu系统如何占满整个屏幕

    VMware虚拟机Ubuntu系统分辨率调节 桌面右击--Disoplay Settings 选择一个跟本机系统一样或者相近的.(本机小米笔记本win11,具体看自己的情况) 结束.

  7. 04、RS232 协议介绍

    从之前的学习,我们知道了 SECS-I 使用的 RS232 来进行数据的传输,那我们也初略的了解下 RS232. 这一篇不用看也可以. 这是最低的协议层.它定义了设备上的物理接口.它是基于RS-232 ...

  8. 【App Service】遇见本地访问Azure App Service应用慢或者是调用第三方接口慢的调试小工具

    问题描述 当应用部署到微软云 Azure后,如果遇见本地访问Azure App Service应用慢或者是调用第三方接口慢的时候,有什么好的调试方法呢? 来判断具体时那一段请求耗时呢? 问题解答 当然 ...

  9. magic book

    magic book.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFo ...

  10. gRPC入门学习之旅(一)

    gRpc简介 gRPC 是Google公司开发的基于HTTP/2设计,面向移动的一个高性能.开源和通用的 RPC 框架,是一款语言中立.平台中立.开源的远程过程调用(RPC)系统. gRpc官网地址: ...