文章概要:

本文对主要就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. 《系列二》-- 7、后置处理器-PostProcessor

    目录 什么是后置处理器 spring 源码中已知的,顶级PostProcessor 其它 "后置处理器" 阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主 ...

  2. windows 上 ffmpeg 库的安装

    真复杂啊 安装 ffmpeg 库有两种途径,一种是自己下载源码再去编译,另一种是使用 vcpkg 自动安装 一般情况下,第二种是最简单方便的,但是如果你需要使用 ffmpeg 的特定历史版本,那就有点 ...

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

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

  4. 前端面试题(四)—— 事件委托(Event Delegation)

    一.什么是事件委托 事件委托(Event Delegation)是一种常用的技术. 它利用事件冒泡的特性,在父元素上监听事件,而不是在子元素上直接添加事件监听器. 通过在父元素上捕获事件,然后根据事件 ...

  5. FPGA MCS文件为什么比BIN文件烧录快

    原因 Xilinx FPGA固化FPGA程序到FLASH时,可以选择使用MCS或者BIN格式,BIN是纯二进制文件,MCS是ASCII格式的文本文件. MCS是Intel早期为MCS系列 II ISI ...

  6. Task Manager 的设计简述

    讲解 Task Manager 之前,在这里先介绍一些 Task Manager 会使用到的概念术语. 图数据库 Nebula Graph 中,存在一些长期在后台运行的任务,我们称之为 Job.存储层 ...

  7. 关于无法查看hadoop的防火墙状态解决方法

    可以参考这两位博主写的 https://www.055401.com/computer/376.html https://blog.csdn.net/weixin_52596632/article/d ...

  8. [C++] epoll编写的echo服务端

    直接贴代码,代码是运行在Linux上面的,通过 g++ epoll.cpp编译 #include <sys/socket.h> #include <sys/epoll.h> # ...

  9. 【苹果】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本

    前言 缘由 Iphone15来了,两年之约你还记得吗? 遂整合之前iphone13及iphone14的相关抢购代码,完成一个SpringBoot监听Iphone15有货邮件提醒+python自动化脚本 ...

  10. PHP四则运算类(支持加、减、乘、除、小中括号)

    <?php /** * 四则运算(支持加.减.乘.除.小中括号) * Class calculator */ class calculator { //保留几位小数点 public $point ...