文章概要:

本文对主要就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. Oracle 高水位(HWM: High Water Mark) 说明

    一. 准备知识:ORACLE的逻辑存储管理. ORACLE在逻辑存储上分4个粒度: 表空间, 段, 区 和 块. 1.1 块: 是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操 ...

  2. Java集合框架学习(二) HashSet详解

    HashSet介绍 这个类实现了Set接口,背后是一个hash table(实际上是个HashMap 实例) .它不保证元素的迭代顺序.尤其是,随着时间推 移它不保证某一元素的位置不变.这个类是非线程 ...

  3. win32 - 将线程重定向到另一个函数(附带Suspend的解释)

    Suspend: 挂起指定的线程 备注:不要永远挂起线程, 因为在Win32中,进程堆是线程安全的对象,并且由于在不访问堆的情况下很难在Win32中完成很多工作,因此在Win32中挂起线程极有可能使进 ...

  4. 【Android逆向】算法还原2

    这题比较简单 1. app-release.apk 安装至手机 提示需要输入账号和密码 2. jadx 打开看看 public native boolean check(byte[] bArr, by ...

  5. 学习go语言编程之并发编程

    并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...

  6. 前端保存JWT的使用方法

    我们可以将JWT保存在cookie中,也可以保存在浏览器的本地存储里,我们保存在浏览器本地存储中 浏览器的本地存储提供了sessionStorage 和 localStorage 两种,从属于wind ...

  7. Jetpack Compose(2) —— 入门实践

    一.项目中使用 Jetpack Compose 从此节开始,为方便起见,如无特殊说明,Compose 均指代 Jetpack Compose. 开发工具: Android Studio 1.1 创建支 ...

  8. 【LeetCode二叉树#20】二叉搜索树转换为累加树,巩固二叉树的遍历(特殊的中序遍历)

    将二叉搜索树转换为累加树 力扣题目链接(opens new window) 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 no ...

  9. 【Azure 应用服务】在Azure Funciton中使用Powershell脚本函数,需要存储一些变量值如何解决?

    问题描述 使用Azure Function创建Powershell脚本来执行函数,在使用中需要存储一些不重要的参数.一般情况,存储的问题都是交给DB,Storage等来解决.但是有没有一种简单的办法呢 ...

  10. 【Azure 环境】IntelliJ IDEA Community Edition 2021.2.3登陆Azure账号时,无法切换到中国区

    问题描述 在IntelliJ IDEA Community Edition 2021.2.3中开发Azure Function程序,最后准备部署到中国区 Azure Function中.如下,在Int ...