KingbaseES 为了更好地适应用户的oracle 应用,实现了对 plsql 的支持,用户可以根据需要使用 plsql 或 plpgsql。 以下简要介绍下二者的差异

一、格式差异

1、plpgsql

plpgsql 必须有 label

[ <<label>> ]
[ DECLARE declarations ]
BEGINstatements
END [ label ];

具体例子:

create or replace function pgsql_test(part integer)
returns integer as $$
declare v_total integer;
beginif part = 0 thenselect count(*) into v_total from t0;elseselect count(*) into v_total from t1;end if;return v_total;
end;
$$ language plpgsql;

2、plsql

plsql 不需要有 label

create or replace function plsql_func01(part integer)
returns integer as
declare v_total integer;
beginif part = 0 thenselect count(*) into v_total from t0;elseselect count(*) into v_total from t1;end if;return v_total;
end;

如果后面没有指明language,KingbaseES 视database_mode参数决定采用哪种解析器。如果database_mode=oracle,默认采用的是plsql 解析器;如果database_mode=pg,则默认采用plpgsql解析器。

二、plsql 支持存储过程

PG11之前,对于plpgsql,函数实际上也称作存储过程,也就是实际没有 create procedure 的概念,函数可以完成数据库的DML操作,实际 function 和 procedure 功能上没有区别。

KingbaseES plsql 同时支持 function and procedure,与oracle function不同,KingbaseES function内部可以进行DML操作。

procedure:过程调用 call plsql_proc01();

create or replace procedure plsql_proc01
as
begininsert into t0 values(1);
end;

function:函数调用 select plsql_func01();

create or replace function plsql_func01
return integer as
begininsert into t0 values(1);return 1;
end;

注:oracle plsql,function 必须作为表达式一部分进行调用,函数体内如果有 DML操作,在调用时是会报错,函数含有自治事务的除外。

三、是否支持嵌套事务

1、plpgsql

plpgsql 并不支持嵌套事务,函数中的事务总是由外层命令(函数的调用者)来控制的,它们本身无法开始或提交事务。

pgisdb=> create or replace function plsql_test(part integer)
pgisdb-> returns integer as
pgisdb-> declare
pgisdb->   v_total integer;
pgisdb-> begin
pgisdb->   if part = 0 then
pgisdb->     select count(*) into v_total from t0;
pgisdb->     commit;
pgisdb->   else
pgisdb->     select count(*) into v_total from t1;
pgisdb->   end if;
pgisdb->   return v_total;
pgisdb-> end;
pgisdb-> /
CREATE FUNCTION
pgisdb=> select plsql_test(0);
ERROR:  invalid transaction termination
CONTEXT:  PL/SQL function plsql_test(integer) line 7 at COMMIT

2、plsql

对于function,不支持函数体内 commit ,事务是否提交由外层事务决定。在V8R6C5版本,将支持函数commit。

pgisdb=> create or replace function plsql_func01
pgisdb-> return integer as
pgisdb-> begin
pgisdb->   insert into t0 values(1);
pgisdb->   commit;
pgisdb->   return 1;
pgisdb-> end;
pgisdb-> /
CREATE FUNCTION
pgisdb=> select plsql_func01();
ERROR:  invalid transaction termination
CONTEXT:  PL/SQL function plsql_func01() line 4 at COMMIT

对于procedure,内部允许commit or rollback。

pgisdb=> create or replace procedure plsql_proc01
pgisdb-> as
pgisdb-> begin
pgisdb->   insert into t0 values(1);
pgisdb->   commit;
pgisdb-> end;
pgisdb-> /
CREATE PROCEDUREpgisdb=> call plsql_proc01();
CALL

注意:如果过程体内含有commit or rollback,则不能在外层再 begin transaction。

pgisdb=> create or replace procedure plsql_proc01
pgisdb-> as
pgisdb-> begin
pgisdb->   insert into t0 values(1);
pgisdb->   commit;
pgisdb-> end;
pgisdb-> /
CREATE PROCEDUREpgisdb=> begin;
BEGIN
pgisdb=> call plsql_proc01();
ERROR:  invalid transaction termination
CONTEXT:  PL/SQL function plsql_proc01() line 4 at COMMIT

四、性能比较

create or replace function pgsql_test()
returns integer as $$
declare v_total integer;
beginselect count(*) into v_total from t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;return v_total;
end;
$$ language plpgsql;test=# begin
test-#   for i in 1..100000 loop
test-#     perform pgsql_test();
test-#   end loop;
test-# end;
test-# /
ANONYMOUS BLOCK
Time: 2450.671 ms (00:02.451)============create or replace function plsql_test()
returns integer as
declare v_total integer;
beginselect count(*) into v_total from t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;return v_total;
end;
/test=# begin
test-#   for i in 1..100000 loop
test-#     perform plsql_test();
test-#   end loop;
test-# end;
test-# /
ANONYMOUS BLOCK
Time: 2454.302 ms (00:02.454)

五、其他差异

1、循环变量定义

plsql: 循环变量 i 可以不用提前定义

create or replace procedure plsql_proc() as
beginfor i in select regexp_split_to_table('ab,bc,cd',',') loopraise notice '%',i;end loop;
end;

plpgsql: 循环变量必须提取定义

create or replace procedure plpgsql_proc() as
$$
beginfor i in select regexp_split_to_table('ab,bc,cd',',') loopraise notice '%',i;end loop;
end;
$$ language plpgsql;ERROR:  loop variable of loop over rows must be a record variable or list of scalar variables
LINE 4:   for i in select regexp_split_to_table('ab,bc,cd',',') loopcreate or replace procedure plpgsql_proc() as
$$
declare v_text text;
beginfor v_text in select regexp_split_to_table('ab,bc,cd',',') loopraise notice '%',v_text;end loop;
end;
$$ language plpgsql;

2、execute & execute immediate

plsql 支持 execute or execute immediate , plpgsql 只支持 execute

PLSQL 与 PLPGSQL相关推荐

  1. ora2pg安装和使用

    文章目录 官方文档 特性 安装(ubuntu18.04/Redhat7.5) 安装说明 依赖安装 安装Ora2pg Oracle迁移 导出SQL文件 修正SQL文件 附录:类型转换记录 MySQL迁移 ...

  2. postgresql函数OUT和INOUT使用方法

    postgresql函数IN,INOUT,OUT使用方法 前言 一个OUT或者INOUT参数 多个OUT或者INOUT参数 前言 最近在做plsql转plpgsql,发现plpgsql的设计不太一样, ...

  3. 金仓数据库KingbaseES plpgsql 编译执行

    目录 1.创建存储过程 2.Postgresql 执行情况 3.KingbaseES 执行情况 4.对于执行大量SQL的效果 5.结论: Oracle 的存储过程或函数提供了两种执行方式: 解释执行: ...

  4. plsql配置多数据源,想换哪个换哪个

    现在的公司内部普遍使用plsql对数据库进行管理.而数据库非常多,从测试到线上环境数据库那么多,我们通常使用同一配置管理,便于切换.那么配置数据库连接就成为了很重要的一步. 1.安装plsql (这里 ...

  5. 解决plsql中文显示问号(???)问题

    最近新买的电脑,配置好数据库连接后,plsql查看数据与插入中文数据都显示问号(???),同事的都正常显示,查看了很多资料,有的说是数据库字符集的原因让修改数据库的字符集,但是我的数据库都是远程连接正 ...

  6. 【转】oracle PLSQL基础学习

    [转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...

  7. mysql plsql循环语句吗,Oracle PLSQL 在游标中用while循环实例程序

    Oracle PLSQL 在游标中用while循环实例程序 Oracle PLSQL 在游标中用while循环实例程序 Oracle PLSQL 在游标中用while循环实例程序 declare cu ...

  8. PLSQL developer 连接不上64位Oracle 解决办法

    在64位Windows2003上安装Oracle后,用PLSQL developer去连接数据库出现报错: Could not load "--\bin\oci.dll" OCID ...

  9. 在64位机上PLSQL连oracle11g问题:SQL*Net not properly installed和ORA-12154:TNS:无法处理服务名...

    今天有同事在给客户安装我们的系统时,出现了问题. 背景:同事安装如下: 服务器是小机,在小机上做的虚拟机.WIN2003操作系统,装的是64位的. 数据库:oracle11g. PLSQL7.5 在6 ...

最新文章

  1. python 指定字符串长度_Python指定字符串的长度,主要是
  2. 理论计算机科学中最令人困惑的谜题之一被解开
  3. 求集合/字符串中的所有组合 (C语言)
  4. Oracle Lsnrctl - 关于oracle监听器的命令和解释
  5. filebeat获取nginx的access日志配置
  6. wxWidgets:在带有 DC 的面板上绘图
  7. HDFS API编程之副本系数
  8. JavaScript享元模式
  9. PHP付费资源下载交易平台网站源码
  10. 从源码分析RocketMQ系列-消息拉取PullMessageProcessor详解
  11. 前苹果M1芯片设计总监跳槽英特尔 或将负责所有SoC架构设计
  12. 【主机】计算机缓存机制
  13. Android Message和obtainMessage的区别
  14. linux ftp配置和使用
  15. yolov3-tiny 训练一个检测器(2)
  16. zone在linux中的含义,linux-日常运维-firewalld的9个zone
  17. 电路基础学习笔记5:实验验证电压源与电流源的等效变换
  18. 网络统考计算机应用基础ppt视频,计算机应用基础课程网络统考辅导.ppt
  19. 一个月提升口语听力n个level
  20. Windows运行加速

热门文章

  1. 局域网内,如何使用命令行关闭别人的电脑
  2. 文件路径问题解决方案
  3. AppScan的许可证
  4. 有道笔记不能连接网络/IE不能上网 - 解决办法
  5. psid mysql_DB2常用SQL的写法(持续更新中...)
  6. 图像处理——如何处理不同格式和深度的图像确保清晰度满足要求
  7. MIPI 系列之 DCS
  8. 普罗米修斯Prometheus+Grafana,监控搭建与界面基础配置
  9. 梅森数 (10 分)
  10. 向量、矩阵、实数、复数之间的各种运算方法