openGauss关于PL/SQL匿名块调用测试
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匿名块调用测试的更多相关文章
- 同样的一句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 ...
- PL/SQL精明的调用栈分析
PL/SQL精明的调用栈分析 原文:http://www.oracle.com/technetwork/issue-archive/2014/14-jan/o14plsql-2045346.html ...
- SQLPLUS执行PL/SQL语句块
1.首先登录Oracle HR schema: 2.对于PL/SQL程序,分号表示语句的结束:而使用 "." 号表示整个语句块的结束,也可以省略.按回车键后,该语句块不会执行,即 ...
- PL/SQL程序中调用Java代码(转)
主要是学习PL/SQL调用JAVA的方法. 平台:WINDOWS 1.首先使用IDE写好需要调用的java代码,再添加"create or replace and compile java ...
- oracle 中使用 pl/sql代码块
1.写匿名块,输入三角形三个表的长度.在控制台打印三角形的面积. declare -- (p=(a+b+c)/2) --声明三角形的面积 三条边 的 v_a number (10,2):=&n ...
- PL/SQL编程-块编程
(1). 简单分类 |————过程(存储过程) | ...
- PL/SQL语句块提高1+case语句
set serveroutput on; declare --默认值的bianliang v_a ; -- v_b integer; --用stud.id 的类型 v_id stud.id%type; ...
- pl/sql 语句块循环语句
---基本循环declarev1 number(2) :=1;begin loop dbms_output.put_line(v1); v1:=v1+1; exit when v1>10; -- ...
- PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)
PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...
- Oracle数据库之PL/SQL异常处理
Oracle数据库之PL/SQL异常处理 异常指的是在程序运行过程中发生的异常事件,通常是由硬件问题或者程序设计问题所导致的. PL/SQL程序设计过程中,即使是写得最好的程序也可能会遇到错误或未预料 ...
随机推荐
- 【转载】大数据OLAP系统--开源组件方案对比
开源大数据OLAP组件,可以分为MOLAP和ROLAP两类.ROLAP中又可细分为MPP数据库和SQL引擎两类.对于SQL引擎又可以再细分为基于MPP架构的SQL引擎和基于通用计算框架的SQL引擎: ...
- 用Pandoc生成TXT格式的目录
我一直使用Markdown格式写作,使用Pandoc生成PDF和Word格式的文档.Pandoc能生成很好的章节和目录,但有时候,也需要生成TXT格式的目录,今天就尝试了一下. 由于我写的内容章节比较 ...
- OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像
前言 通过相机图片可以识别出棋盘角点了,这时候我们需要通过角点去计算相机内参矩阵,通过上篇得知畸变的原理,所以我们尽可能要全方位都能获取标定图片,全方位意思是提供的多张图综合起来基本覆盖了相机所有 ...
- 重新认识 tag 快照 git (项目临时添加需求,之前有分支合并,导致从节点拉分支不行了,因为没有tag快照)
之前的tag认知 之前一直以为tag就是在git的提交commit上打一个标,然后可以拉出分支.之前没太重视. 因为我觉得 可以直接从某个commit直接拉出分支,这打不打tag无所谓 翻车现场 今天 ...
- InputRegZen.vue 正则Input 限制输入框输入内容
核心内容 已经 perfect,没有用外库,原生完成 用的 iview的Input组件 封装 // InputRegZen.vue <template> <div> <I ...
- weekToDo - 一个本地todo软件 - 软件推荐 先用着试试
https://weektodo.me/ https://github.com/Zuntek/WeekToDoWeb/releases/download/v1.7.0/WeekToDo-Setup-1 ...
- printJS 打印 无头无尾 style 加 @page { margin: 0; } body { padding: 100px;}
// 使用npm模块 print-js printJS({ printable: this.printData, type: 'json', documentTitle: ' ', propertie ...
- j-link仿真器的作用和价值以及Ubuntu下使用注意事项
一 J-LINK是什么? J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器.配合IAR EWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有A ...
- day04-Java基础语法
Java基础语法 1.注释 注释不会被执行,是用来给写代码的人看的. 1.1单行注释 单行注释只能注释一行文字 // 注释 1.2多行注释 多行注释可以注释多行文字 /* 注释 注释 注释 */ 1. ...
- 多线程系列(二十) -CompletableFuture使用详解
一.摘要 在上篇文章中,我们介绍了Future相关的用法,使用它可以获取异步任务执行的返回值. 我们再次回顾一下Future相关的用法. public class FutureTest { publi ...