首页 > 数据库 >openGauss关于PL/SQL匿名块调用测试

openGauss关于PL/SQL匿名块调用测试

时间:2024-04-01 14:44:58浏览次数:19  
标签:-# t1 匿名 SQL openGauss PL

openGauss 关于 PL/SQL 匿名块调用测试
一、原理介绍
PL/SQL(Procedure Language/Structure Query Language)是标准 SQL 语言添加了过程化功能的一门程序设计语言。

单一的 SQL 语句只能进行数据操作,没有流程控制,无法开发复杂的应用。PL/SQL 语言是结合了结构化查询与数据库自身过程控制为一体的强大语言。

1.PL/SQL 原理
PL/SQL 是一种块结构的语言,它将一组语句放在一个块中,一次性发送给服务器。

PL/SQL 引擎分析收到 PL/SQL 语句块中的内容,把其中的过程控制语句由 PL/SQL 引擎自身去执行,把 PL/SQL 块中的 SQL 语句交给服务器的 SQL 语句执行器执行。

PL/SQL 块发送给服务器后,先被编译然后执行,对于有名称的 PL/SQL 块(如子程序)可以单独编译,永久的存储在数据库中,随时准备执行。

PL/SQL 是一种块结构的语言,一个 PL/SQL 程序包含了一个或者多个逻辑块,逻辑块中可以声明变量,变量在使用之前必须先声明。

2.PL/SQL 特点
–与 SQL 紧密结合 –支持面向对象编程 –更好的性能 –可移植性 –安全性

3.语法结构
除了正常的执行程序外,PL/SQL 还提供了专门的异常处理部分进行异常处理

[DECLARE
--declaration statements] ①
BEGIN
--executable statements ②
[EXCEPTION
--exception statements] ③
END;
语法解析 ① 声明部分:声明部分包含了变量和常量的定义。在此声明 PL/SQL 用到的变量,类型及游标,以及局部的存储过程和函数, 这个部分由关键字 DECLARE 开始,如果不声明变量或者常量,可以省略这部分。 ② 执行部分:执行部分是 PL/SQL 块的指令部分,由关键字 BEGIN 开始,关键字 END 结尾。 所有的可执行 PL/SQL 语句都放在这一部分,该部分执行命令并操作变量。其他的 PL/SQL 块可以作为子块嵌套在该部分。 PL/SQL 块的执行部分是必选的。注意 END 关键字后面用分号结尾。 ③ 异常处理部分:该部分是可选的,该部分用 EXCEPTION 关键字把可执行部分分成两个小部分,之前的程序是正常运行的程序, 一旦出现异常就跳转到异常部分执行。

4.PL/SQL 语句块的类型
1、匿名块 2、命名块 –①procedure 存储过程 –②function 函数 –③package 包 –④trigger 触发器

原本大家可能一提到 PL/SQL 就会想到 ORACLE,ORACLE 的 PL/SQL 很强大,它的匿名块调用以及有名块调用可以解决很多问题,在 openGauss 中,其实也有这样的功能,如下,是我针对 openGauss 匿名块的一些测试。

二、匿名块测试
1.普通匿名块调用
openGauss=# create table t1(a int ,b text);
CREATE TABLE

openGauss=# DECLARE
openGauss-# PRAGMA AUTONOMOUS_TRANSACTION;
openGauss-# BEGIN
openGauss$# raise notice 'Normal anonymous block printing.';
openGauss$# insert into t1 values(1,'I am lmj!');
openGauss$# END;
openGauss$# /
NOTICE: Normal anonymous block printing.

ANONYMOUS BLOCK EXECUTE
openGauss=# select * from t1;
a | b
---+-----------
1 | I am lmj!
(1 row)
2.匿名块和事务影响
启动一个事务后,执行一个自治事务匿名块,如果事务回滚,则匿名块不回滚。

3.外部匿名块和内部匿名块
其中外部匿名块是一个公共匿名块,而内部匿名块是一个自治事务匿名块,可以根据如下例子和第二个例子对比事务回滚和匿名块回滚

openGauss=# truncate table t1;
TRUNCATE TABLE

openGauss=# START TRANSACTION;
START TRANSACTION
openGauss=# DECLARE
openGauss-# PRAGMA AUTONOMOUS_TRANSACTION;
openGauss-# BEGIN
openGauss$# raise notice 'an autonomous transaction anonymous block.';
openGauss$# insert into t1 values(1,'it will commit!');
openGauss$# END;
openGauss$# /
NOTICE: an autonomous transaction anonymous block.

ANONYMOUS BLOCK EXECUTE
openGauss=# insert into t1 values(1,'you will rollback!');
INSERT 0 1
openGauss=# rollback;
ROLLBACK
openGauss=# select * from t1;
a | b
---+-----------------
1 | it will commit!
(1 row)
4.匿名块直接执行自治事务匿名块并引发异常
openGauss=# DECLARE
openGauss-# PRAGMA AUTONOMOUS_TRANSACTION;
openGauss-# res int := 0;
openGauss-# res2 int := 1;
openGauss-# BEGIN
openGauss$# raise notice 'just use call.';
openGauss$# res2 = res2/res;
openGauss$# END;
openGauss$# /
NOTICE: just use call.

ERROR: ERROR: division by zero
CONTEXT: PL/pgSQL function inline_code_block line 7 at assignment
匿名块执行错误,会报出异常

5.异常捕获
在执行期间引发异常后,将捕获匿名块,如下所示,在执行错误后,抛出 autonomous throw exception 提示

openGauss=# DECLARE
openGauss-# PRAGMA AUTONOMOUS_TRANSACTION;
openGauss-# res int := 0;
openGauss-# res2 int := 1;
openGauss-# BEGIN
openGauss$# raise notice 'error catch.';
openGauss$# res2 = res2/res;
openGauss$# EXCEPTION
openGauss$# WHEN division_by_zero THEN
openGauss$# raise notice 'autonomous throw exception.';
openGauss$# END;
openGauss$# /
NOTICE: error catch.

NOTICE: autonomous throw exception.

ANONYMOUS BLOCK EXECUTE

标签:-#,t1,匿名,SQL,openGauss,PL
From: https://www.cnblogs.com/helloopenGauss/p/18108372

相关文章

  • 用户、组或角色 'xxx 在当前数据库中已存在 Microsoft SQL Server,错误: 15023
    为一个数据库添加一个用户或者映射数据库时,提示以下错误信息:用户、组或角色*****在当前数据库中已存在。(MicrosoftSQLServer,错误:15023)问题原因:在还原数据库的过程中,在其它sqlserver服务器上进行还原之后,会出现一个在原服务器上可以正常的用户在目标服务器上出现无......
  • openGauss数据库将磁盘表转换为MOT
    openGauss数据库将磁盘表转换为MOT一、将磁盘表转换为MOT方法磁盘表直接转换为MOT尚不能实现,这意味着尚不存在将基于磁盘的表转换为MOT的ALTERTABLE语句。目前MOT表也不支持rename,createasselect以及insertselect(普通表)的操作。将基于磁盘的表转换为MOT方......
  • MogDB/openGauss如何实现事务的rollback
    MogDB/openGauss如何实现事务的rollback本文出处:https://www.modb.pro/db/113262数据库最主要的功能就是存储数据,然而我们在进行数据库操作时,却很容易发生误操作数据的情况,那么在MogDB中该如何实现误操作数据恢复呢?本文通过具体示例简要介绍如何通过回滚还原到误操作前的状......
  • 【附源码】JAVA计算机毕业设计智慧外贸平台(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在全球经济一体化的时代背景下,智慧外贸平台的建设已成为提升我国外贸竞争力、优化国际贸易环境的关键一环。随着信息技术的迅猛发展,传统的外贸模式已......
  • 【附源码】JAVA计算机毕业设计智慧物流管理系统(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息化时代的快速发展,物流行业作为现代经济体系的重要支柱,正面临着前所未有的机遇与挑战。传统的物流管理方式已难以适应现代社会的需求,智能化、......
  • 【附源码】JAVA计算机毕业设计智慧小饭桌(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着社会的快速发展和科技的进步,人们对教育的关注和要求也在不断提高。在当今快节奏的生活中,许多家庭面临着孩子午餐难以解决的问题,尤其是对于那些工......
  • 【附源码】JAVA计算机毕业设计智慧型居民小区物业管理(springboot+mysql+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和居民生活水平的提高,智慧型居民小区逐渐成为现代城市发展的一个重要方向。在这样的背景下,传统物业管理模式已难以满足居民日益......
  • 如何保证MySQL和Redis数据一致性?
    背景在高并发的业务场景中,因为MySQL数据库是操作磁盘效率比较低,因此大多数情况下数据库都是高并发系统的瓶颈。因为Redis操作数据是在内存中进行,所以就需要使用Redis做一个缓存。让请求先访问到Redis,而不是直接访问MySQL数据库。效果图如下查询数据上面的业务场景,就是一个典......
  • mysql语法和函数使用
    group_concat()参考连接:https://www.jb51.net/article/87328.htm手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果。比较抽象,难以理解。通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来。要返回哪些列,由函数参数(就是字......
  • [转帖]mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间,mysq
    https://www.cnblogs.com/jpfss/p/8759284.html1、当前日期selectDATE_SUB(curdate(),INTERVAL0DAY);2、明天日期selectDATE_SUB(curdate(),INTERVAL-1DAY);3、昨天日期selectDATE_SUB(curdate(),INTERVAL1DAY);4、前一个小时时间selectdate_sub(now(),in......