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

openGauss关于PL/SQL匿名块调用测试的更多相关文章

  1. 同样的一句SQL语句在pl/sql 代码块中count 没有数据,但是直接用SQl 执行却可以count 得到结果

    pl/sql 代码块: SELECT count(distinct t2.so_nbr) INTO v_count2 FROM KFGL_YW_STEP_qd t2 WHERE t2.partitio ...

  2. PL/SQL精明的调用栈分析

    PL/SQL精明的调用栈分析 原文:http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html ...

  3. SQLPLUS执行PL/SQL语句块

    1.首先登录Oracle HR schema: 2.对于PL/SQL程序,分号表示语句的结束:而使用 "."  号表示整个语句块的结束,也可以省略.按回车键后,该语句块不会执行,即 ...

  4. PL/SQL程序中调用Java代码(转)

    主要是学习PL/SQL调用JAVA的方法. 平台:WINDOWS 1.首先使用IDE写好需要调用的java代码,再添加"create or replace and compile java ...

  5. oracle 中使用 pl/sql代码块

    1.写匿名块,输入三角形三个表的长度.在控制台打印三角形的面积. declare -- (p=(a+b+c)/2) --声明三角形的面积 三条边 的 v_a number (10,2):=&n ...

  6. PL/SQL编程-块编程

    (1). 简单分类                           |————过程(存储过程)                           |                        ...

  7. PL/SQL语句块提高1+case语句

    set serveroutput on; declare --默认值的bianliang v_a ; -- v_b integer; --用stud.id 的类型 v_id stud.id%type; ...

  8. pl/sql 语句块循环语句

    ---基本循环declarev1 number(2) :=1;begin loop dbms_output.put_line(v1); v1:=v1+1; exit when v1>10; -- ...

  9. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...

  10. Oracle数据库之PL/SQL异常处理

    Oracle数据库之PL/SQL异常处理 异常指的是在程序运行过程中发生的异常事件,通常是由硬件问题或者程序设计问题所导致的. PL/SQL程序设计过程中,即使是写得最好的程序也可能会遇到错误或未预料 ...

随机推荐

  1. 【Azure Developer】使用Azure Key Vault 的Key签名后,离线验证的一些参考资料

    问题描述 使用 key Vault 的sign接口,Request Body中的 Value 是要传什么呢? 签名后的内容如何在本地离线验证呢? Azure Key Vault Sign 接口:htt ...

  2. 可视化技术在 Nebula Graph 中的应用

    本文首发于 Nebula Graph Community 公众号 本文整理自 #可视化 on Live 主题直播,在本期直播中 3 位可视化嘉宾讲述了他们眼中的可视化,以及他们在可视化项目实践中踩过的 ...

  3. 关于mv命令,系统是如何区分是移动还是重命名

    ​ 引入: 精简回答版:重命名的本质仍是移动覆盖 ,所以不存在应该如何区分的问题 最近学习到linux基础命令中的mv命令,了解到mv命令的作用是对文件的移动和重命名,但自己一直想不明白系统是如何分辨 ...

  4. C++ Qt开发:运用QThread多线程组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QTh ...

  5. sql99等值&&非等值查询

    1 #二.sql99语法 2 /* 3 语法 4 SELECT 查询列表 5 FROM 表1 别名 [连接类型] 6 JOIN 表2 别名 7 on 连接条件 8 [where 筛选条件] 9 [gr ...

  6. FreeRTOS教程3 中断管理

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...

  7. vscode 格式化 vue 等文件的 配置 eslint vetur prettier Beautify

    需求 自动格式化需求 多行回车 合并一行,去分号 最后一个逗号,自动删除,符合eslint 结果 虽然能用了,但是 百度好几个方案,也不知道哪个对哪个,太忙没时间弄了. 配置文件记录 eslint 得 ...

  8. linux文件管理(补充)

    linux文件管理 vim编辑器 vi概述 vi 编辑器 他是linux和unix系统上最基本的文本编辑器,类似于windows系统下的记事本编辑器 vim编辑器 vim是vi的加强版,比vi更容易使 ...

  9. ReACT介绍与llama_index ReActAgent实践

    Agent是大模型的重要应用方向,而ReACT是学术界提出的重要方法,本文介绍ReACT论文,然后通过llama_index ReActAgent来分析ReACT的执行过程. ReACT <RE ...

  10. esp8266 I2C 实例解析及源码分析

    一  前言 作为一个方案商兼芯片开发者,研究芯片和功能实现除了基本的工作需要,还有一层就是也变成了一种职业习惯.从芯片到方案,发现很多方案公司的人水平都比较堪忧,只会调用api,根本不会看底层的代码实 ...