当前位置:首页 > 数据库 > PLSQL 与 PLPGSQL

PLSQL 与 PLPGSQL

2022年09月17日 10:19:45数据库6

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

一、格式差异

1、plpgsql

plpgsql 必须有 label

[ <<label>> ]
[ DECLARE declarations ]
BEGIN
    statements
END [ label ];

具体例子:

create or replace function pgsql_test(part integer)
returns integer as $$
declare 
  v_total integer;
begin
  if part = 0 then
    select count(*) into v_total from t0;
  else
    select 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;
begin
  if part = 0 then
    select count(*) into v_total from t0;
  else
    select 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
begin
  insert into t0 values(1);
end;

function:函数调用 select plsql_func01();

create or replace function plsql_func01
return integer as 
begin
  insert 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 PROCEDURE

pgisdb=> 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 PROCEDURE

pgisdb=> 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;
begin
  select 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;
begin
  select 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 
begin
  for i in select regexp_split_to_table('ab,bc,cd',',') loop
    raise notice '%',i;
  end loop;
end;

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

create or replace procedure plpgsql_proc() as 
$$
begin
  for i in select regexp_split_to_table('ab,bc,cd',',') loop
    raise 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',',') loop


create or replace procedure plpgsql_proc() as 
$$
declare 
  v_text text;
begin
  for v_text in select regexp_split_to_table('ab,bc,cd',',') loop
    raise notice '%',v_text;
  end loop;
end;
$$ language plpgsql;

 2、execute & execute immediate

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

 

作者:KINGBASE研究院
来源链接:https://www.cnblogs.com/kingbase/p/14876022.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/database/42515.html

标签: PLSQL
分享给朋友:

“PLSQL 与 PLPGSQL” 的相关文章

使用PLSQL Developer连接远程数据库的两种方法

使用PLSQL Developer连接远程数据库的两种方法

使用plsql连接远程数据库,不仅要安装PLSQL Developer,还需要安装oracle instantclient客户端,并将PLSQL Developer的tools->preferences connection的oracle home...

plsql Developer 登录卡死

查看 listener.log 大小 listener.log 目录位置 listener.log 目录位置链接:https://blog.csdn.net/a61595579/article/details/52446916...

plsql的database下拉为空,如何解决?

plsql的database下拉为空,如何解决?

为什么plsql的database下拉为空?我在tnsnames.ora中设置了字符串ORCL,疑惑了我好久,在网上找了许久解决方案,终于是解决了!如下对我的解决过程做一个记录。 如何解决plsql的database下拉为空?   为什么plsql的databa...

使用plsql Developer 连接远程服务器

使用plsql Developer 连接远程服务器

大致说一下我的环境1本地已经安装好了Oracle 并且安装了plsql Developer 但是因为要连接另外一台oracle 数据库服务器  所以需要配一下远程连接 2首先声明我这里是本地先安装好Oracle数据据库以后(说明系统的一些变量都已经配置...

【PLSQL】变量声明,结构语句,cursor游标

************************************************************************   ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ********...

PLSQL安装与使用

PLSQL安装与使用

1.下载 PLSQL14下载地址: https://cloud.189.cn/web/share?code=e63UnujmYnI3 官网下载:https://www.allroundautomations.com/ 2.安装 3.激活...

PLSQL 11 注册码

注册码: Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number:601769 password:xs374ca...

PLSQL Developer破解注册码

product code: 4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3le  serial Number:226959  password: xs374ca 作者:阿趟哥 来源链接:https://blog.csdn.net/...

Oracle数据库安装+PLSQL安装配置整理

Oracle数据库安装+PLSQL安装配置整理

1、Oracle安装过程   1.1 下载11g安装包 oracle Database 11g 第 2 版 (11.2.0.1.0) 标准版、标准版 1 以及企业版,适用于 Microsoft Windows (x64) 的 Oracle Databa...

PLSQL

SQL> -- 书写一个最简单的PLSQLSQL> select 'hello' from dual; 'HELLO'            &nb...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。