Kingbase ES函数参数模式与Oracle的异同
文章概要:
本文对主要就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的异同的更多相关文章
- Oracle过程及函数的参数模式,In、out、in out模式
Oracle过程及函数的参数模式 In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: ( ...
- Oracle过程及函数的参数模式详解
一.In.out.in out模式 在Oracle中过程与函数都可以有参数,参数的类型可以指定为in.out.in out三种模式. 三种参数的具体说明,如下图所示: (1)in模式 in模式是引用传 ...
- 深入理解javascript函数系列第二篇——函数参数
× 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...
- Java 函数参数传递方式详解 分类: Java Game 2014-08-15 06:34 82人阅读 评论(0) 收藏
转:http://zzproc.iteye.com/blog/1328591 在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. ...
- Java函数参数传递方式详解
在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简 ...
- TensorFlow卷积网络常用函数参数详细总结
卷积操作 tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) 除去name参数用以指定该操作 ...
- python学习day10 函数Ⅱ(参数&作用域)
函数Ⅱ(参数&作用域) 知识小结: py2与py3的区别 逻辑运算()>not>and>or 字符串翻转切片翻转 is与==区别 git相关 数据类型判断 操作系统:cent ...
- Day8 函数指针做函数参数
课堂笔记 课程回顾 多态 virtual关键字 纯虚函数 virtual func() = 0; 提前布局vptr指针 面向接口编程 延迟绑定 多态的析构函数的虚函数. ...
- JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...
- JavaScript进阶系列01,函数的声明,函数参数,函数闭包
本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...
随机推荐
- 《系列二》-- 7、后置处理器-PostProcessor
目录 什么是后置处理器 spring 源码中已知的,顶级PostProcessor 其它 "后置处理器" 阅读之前要注意的东西:本文就是主打流水账式的源码阅读,主导的是一个参考,主 ...
- windows 上 ffmpeg 库的安装
真复杂啊 安装 ffmpeg 库有两种途径,一种是自己下载源码再去编译,另一种是使用 vcpkg 自动安装 一般情况下,第二种是最简单方便的,但是如果你需要使用 ffmpeg 的特定历史版本,那就有点 ...
- 学习go语言编程之并发编程
并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...
- 前端面试题(四)—— 事件委托(Event Delegation)
一.什么是事件委托 事件委托(Event Delegation)是一种常用的技术. 它利用事件冒泡的特性,在父元素上监听事件,而不是在子元素上直接添加事件监听器. 通过在父元素上捕获事件,然后根据事件 ...
- FPGA MCS文件为什么比BIN文件烧录快
原因 Xilinx FPGA固化FPGA程序到FLASH时,可以选择使用MCS或者BIN格式,BIN是纯二进制文件,MCS是ASCII格式的文本文件. MCS是Intel早期为MCS系列 II ISI ...
- Task Manager 的设计简述
讲解 Task Manager 之前,在这里先介绍一些 Task Manager 会使用到的概念术语. 图数据库 Nebula Graph 中,存在一些长期在后台运行的任务,我们称之为 Job.存储层 ...
- 关于无法查看hadoop的防火墙状态解决方法
可以参考这两位博主写的 https://www.055401.com/computer/376.html https://blog.csdn.net/weixin_52596632/article/d ...
- [C++] epoll编写的echo服务端
直接贴代码,代码是运行在Linux上面的,通过 g++ epoll.cpp编译 #include <sys/socket.h> #include <sys/epoll.h> # ...
- 【苹果】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
前言 缘由 Iphone15来了,两年之约你还记得吗? 遂整合之前iphone13及iphone14的相关抢购代码,完成一个SpringBoot监听Iphone15有货邮件提醒+python自动化脚本 ...
- PHP四则运算类(支持加、减、乘、除、小中括号)
<?php /** * 四则运算(支持加.减.乘.除.小中括号) * Class calculator */ class calculator { //保留几位小数点 public $point ...