虽然之前写了不少Oracle上的SQL语句,但是没有抽出时间对Oracle进行一个系统的学习,实践固然重要,但没有一个理论上的规范学习与理解,在实践中就不能举一反三,就不能写出高规范高质量的SQL语句。

-- PL/SQL 基本写法

-- 说明:声明、异常处理部分为可选,视具体程序而定

-- 博客记录点滴 http://www.linuxidc.com 转载注明出处

DECLARE -- 声明变量

A INTEGER;-- 只声明

B FLOAT := 0;-- 带赋值的声明

C FLOAT;

BEGIN -- 可执行语句开始

DBMS_OUTPUT.put_line('开始执行可执行语句块![http://www.linuxidc.com转载注明出处]');

A := 1.5;

DBMS_OUTPUT.put_line('A=' || A);

DBMS_OUTPUT.put_line('B=' || B);

C := A / B; -- 会引发分母为0的异常,下面的两条输出语句将无法执行

DBMS_OUTPUT.put_line('C=' || C);

DBMS_OUTPUT.put_line('可执行语句块执行完毕![http://www.linuxidc.com转载注明出处]');

EXCEPTION -- 异常处理

WHEN OTHERS THEN

DBMS_OUTPUT.put_line('[PL/SQL 基本写法]中出现异常,错误代码:ORA'||sqlcode);

END; -- 可执行语句结束

/ -- 该符号表示执行这段PL/SQL代码

执行后的输出:

开始执行可执行语句块![http://blog.csdn.net/ls_man转载注明出处]

A=2

B=0

[PL/SQL 基本写法]中出现异常,错误代码:ORA-1476

我们再看一下如何通过异常处理实现数据库事务:

-- PL/SQL 事务

-- 说明:有多条修改数据的语句执行,如果其中某条出错,之前的更改也不会记入数据库

-- 博客记录点滴 http://www.linuxidc.com 转载注明出处

-- 1.先创建一个测试表

DECLARE

V_SQL_DROP_TABLE  VARCHAR2(50) := 'DROP TABLE MY_TEST';

V_SQL_CREATE_TABLE VARCHAR2(100) := 'CREATE TABLE MY_TEST(NOT_NULL VARCHAR2(20) NOT NULL, ONLY_INT INTEGER)';

BEGIN

EXECUTE IMMEDIATE V_SQL_CREATE_TABLE; -- 创建测试表

EXCEPTION

-- 如果表已存在,则会引发异常

WHEN OTHERS THEN

EXECUTE IMMEDIATE V_SQL_DROP_TABLE; -- 先删除

EXECUTE IMMEDIATE V_SQL_CREATE_TABLE; -- 再创建

END;

/

--2.用我们刚创建的测试表进行测试

DECLARE

V_COUNT INTEGER; -- 表中记录的行数

V_INT_VAL MY_TEST.ONLY_INT%TYPE; -- 使用%TYPE关键字参照某表某字段类型声明变量

BEGIN

V_INT_VAL := 123456;

-- 插入一条正确的数据

INSERT INTO MY_TEST VALUES ('TEST_SUCCESS', V_INT_VAL);

-- 查询条数为1条,我们发现插入成功了

SELECT COUNT(*) INTO V_COUNT FROM MY_TEST;

DBMS_OUTPUT.put_line('MY_TEST表中有' || V_COUNT || '条记录');

-- 插入一条错误的数据,因为第二个字段为int型,插入字符数据肯定会出错

INSERT INTO MY_TEST VALUES ('TEST_FAIL', 'ABC');

-- 最后提交更改

COMMIT;

EXCEPTION

-- 异常处理

WHEN OTHERS THEN

ROLLBACK; -- 异常时回滚,这样第一次插入的正确数据也不会保存到数据库

DBMS_OUTPUT.put_line('[PL/SQL 事务]中出现异常,错误代码:ORA' || sqlcode);

-- 我们验证一下表里的数据为0条

SELECT COUNT(*) INTO V_COUNT FROM MY_TEST;

DBMS_OUTPUT.put_line('回滚后,MY_TEST表中有' || V_COUNT || '条记录');

END; -- 可执行语句结束

/ -- 该符号表示执行这段PL/SQL代码

执行后的输出:

MY_TEST表中有1条记录

[PL/SQL 事务]中出现异常,错误代码:ORA-1722

回滚后,MY_TEST表中有0条记录

相关阅读:

在64位Win7系统下安装Oracle 11g和Oracle SQL Developer客户端 http://www.linuxidc.com/Linux/2012-11/74809.htm

mysql 事务块 sql_Oracle_PL/SQL的基本写法_BEGIN_END块结构及简单的事务实现相关推荐

  1. 数据库——python操作MySQL、修改表SQL语句、视图、触发器、存储过程、事务、流程控制、常见函数、索引

    文章目录 一.python操作MySQL 1.pymysql模块 1.基本使用 2.sql注入问题 3.二次确认 二.修改表SQL语句 1.修改表的名字 rename 2.添加字段 add 3.修改字 ...

  2. MySQL基础教程 包含SQL语句、约束、表关系、设计范式、多表、事务等

    简介 数据库 ​ 数据库(Database):是按照数据结构来组织.存储和管理数据的仓库.每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据. ​ 我们也可以将数据存 ...

  3. oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...

    本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...

  4. mysql事务日志备份_事务日志备份 (SQL Server)

    事务日志备份 (SQL Server)Transaction Log Backups (SQL Server) 01/05/2018 本文内容 适用于:Applies to: SQL ServerSQ ...

  5. mysql中编写匿名块_Oracle_PL/SQL(1) 匿名块

    1. PL/SQL 简介 PL/SQL是一种比较复杂的程序设计语言, 用于从各种环境中访问Oracle数据库. 为什么使用PL/SQL? Orade是一种关系型数据库, 用来访问关系型数据库的语言是 ...

  6. Mysql面试题,sql优化,存储引擎,数据结构,基础知识等

    目录 一.相关知识 什么是MySQL?SQL是什么? SQL的生命周期? 什么是超键.候选键.主键.外键? 数据库有哪几个范式,谈谈理解? MySQL的binlog有有几种录入格式?分别有什么区别? ...

  7. MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)

    目录 0 存储引擎介绍 1 SQL性能分析 2 常见通用的JOIN查询 SQL执行加载顺序 七种JOIN写法 3 索引介绍 3.1 索引是什么 3.2 索引优劣势 3.3 索引分类和建索引命令语句 3 ...

  8. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

    1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...

  9. mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)

    站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...

最新文章

  1. 2022-2028年中国液化石油气(LPG)行业投资分析及前景预测报告
  2. Java盗刷_一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!
  3. etcd 指定配置文件启动_ETCD 简介 + 使用
  4. typedef函数指针使用方法
  5. Docker | makefile错误提示 *** missing separator. Stop.
  6. macOS下加载动态库dylib报code signature invalid错误的解决办法
  7. Python爬取猪肉价格网并获取Json数据
  8. 计算机科学中的虚拟化包括哪些,计算机虚拟化包括哪几个方面(计算机虚拟技术在计算机教学中的应用探究)...
  9. 字段缺失_区分Protobuf 3中缺失值和默认值
  10. 基于海量日志和时序数据的质量建设最佳实践
  11. 就算会用python画颗心,可你依然还是只单身狗
  12. 心路历程5:雨天 --by Tsui
  13. java 查找文件_Java 实例 – 在指定目录中查找文件
  14. [转]Birdfont 2.10 发布,字体编辑器
  15. 前端开发_HTML5_布局-div+css布局
  16. 软件工程 可行性分析与需求分析
  17. RESTFul API
  18. C++实现石头剪刀布
  19. 结对第一次—原型设计(文献摘要热词统计)
  20. 同态加法_我对同态的想法

热门文章

  1. 定位的坐标原点HTML,html 定位
  2. python统计窗口函数怎么处理_python时间序列:移动窗口函数前篇
  3. python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法
  4. python长整型字节数_Python将整数转换为16字节字节
  5. Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)
  6. 在centos上搭建redis集群并附测试(真集群非伪集群)
  7. Python 骚操作,微信远程控制电脑
  8. Java8 ReentrantLock 源码分析
  9. wxWidgets:wxFileCtrl类用法
  10. boost::spirit::classic相关的测试程序