PL/SQL 学习分享(续)
事务
事务的概述
事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作。
多个操作作为一个整体向系统提交,要么都执行,要么都不执行。
事务是一个不可分割的工作逻辑单元。
事务,一个完整的操作流程。
事务举个栗子:
事务的特性
事务必须具备以下四个属性,简称ACID。
属性:
- 原子性(Atomicity):(一个事务是不可再分的)
事务是一个完整的操作,事务的各步操作时不分的(原子的);要么都执行,要么都不执行。 - 一致性(Consistency):
当事务完成时,数据必须处于一致状态。 - 隔离性(Isolation):
并发事务之间彼此隔离、独立,它不应以任何方式依赖于或影响其他事务。 - 永久性(Durability):
事务完成后,它对数据库的修改被永久保持。
回滚点
Oracle 使用 SAVEPOINT 来设置回滚点。
INSERT INTO TEST VALUES ('Scott');
SAVEPOINT sp1;
INSERT INTO TEST VALUES ('Tom');
ROLLBACK TO SAVEPOINT sp1; -- 回滚到sp1,'Tom' 记录会被回滚
COMMIT;
事务实例练习
编写sql程序块模拟转账功能
1:用户登录过程(根据用户名、密码进行登录验证)
2:验证成功,进行转账(由1001001向1001002转1000元),转账失败显示错误信息,要求数据的一致性
3.验证失败,使用异常显示错误信息
set serveroutput on;
declare
type t_send is record(card_id bnkCard.cardNo%type,card_money bnkCard.cardMoney%type);
type t_set is table of t_send index by binary_integer;
num number := 1000;
test_exception exception;-- 自定义异常
user_v VARCHAR2(10) :='xxx';
pwd_v number(10) :=123;
begin
case user_v
when 'xxx'
then
update bnkCard set cardMoney = cardMoney-num where cardNo='1001001';
update bnkCard set cardMoney = cardMoney+num where cardNo='1001002';
else
raise test_exception;--抛出异常
end case;
COMMIT; --提交事务
dbms_output.put_line('验证通过,转账成功');
exception
when test_exception
then dbms_output.put_line('用户名密码不符合要求');
ROLLBACK; --回滚
end;
动态SQL
动态SQL概述
什么是动态SQL?
编译期间SQL语句是不确定的,并且在运行时允许发生变化。
动态SQL应用场合
要执行一个DDL语句时
需要增加程序的灵活性时
使用包DBMS_SQL动态执行SQL语句时
动态SQL的执行语法
EXECUTE IMMEDIATE语句
语法:
EXECUTE IMMEDIATE dynamic_sql;
绑定变量
通过占位符绑定参数
参数类型可以是集合、对象等
不支持PL/SQL定义的类型
语法:
动态SQL创建表
--动态SQL的执行
begin
execute immediate 'create table test_demo(id number primary key,uname varchar2(20) not null)';
end;
动态SQL:绑定变量
--动态SQL:绑定变量
declare
id_v number :=1;
uname_v VARCHAR2(20) :='admin';
sql_v VARCHAR2(50);
begin
sql_v:='insert into test_demo values(:1,:2)'; -- :1 代表第几个参数
execute immediate sql_v using id_v,uname_v;
end;
动态SQL综合案例添加数据
--创建用户表tem_user
--编号:number类型 姓名:varchar2(20) 年龄:number
--若表存在请 先删除
--向表tem_user存入数据编号为1001、用户名“孙悟空”,年龄为30。
set serveroutput on;
declare
num binary_integer;
drop_sql VARCHAR2(100);
create_sql VARCHAR2(100);
insert_sql VARCHAR2(100);
id_v number :=1001;
name_v varchar2(20) :='孙悟空';
age_v number :=30;
begin
select count(*) into num from all_tables where table_name='tem_user';
if num>0
then
drop_sql:='drop table tem_user';
execute immediate drop_sql;
end if;
create_sql:='create table tem_user(id number primary key,name varchar2(20) not null,age number not null)';
execute immediate create_sql;
insert_sql:='insert into tem_user values (:1,:2,:3)';
execute immediate insert_sql using id_v,name_v,age_v;
COMMIT;
dbms_output.put_line('添加成功');
exception
when others then rollback;
dbms_output.put_line('添加失败');
end;
使用imp和exp导入导出数据
一 : 数据导出:
1、 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
2、 将数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
3、 将数据库中的表table1 、table2导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
4、 将数据库中的表table1中的字段filed1以”00”打头的数据导出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"
二 : 数据的导入
1、将D:\daochu.dmp 中的数据导入 TEST数据库中。
imp system/manager@TEST file=d:\daochu.dmp
上面可能有点问题,因为有的表已经存在,然后它就报错,对该表就不进行导入。
在后面加上 ignore=y 就可以了。
2 将d:\daochu.dmp中的表table1 导入
imp system/manager@TEST file=d:\daochu.dmp tables=(table1)
数据的导入导出参考博客:
http://www.cnblogs.com/mq0036/archive/2012/11/13/2768290.html
PL/SQL 学习分享(续)的更多相关文章
- PL/SQL 学习分享
PL SQL概述 什么是PLSQL PLSQL的特点 PLSQL的开发环境 PLSQL的工作原理 语句块重点部分 PLSQL声明命名规则 声明 命名规则 表达式和运算符 表达式的分类 运算符分类 流程 ...
- ORALCE PL/SQL学习笔记
ORALCE PL/SQL学习笔记 详情见自己电脑的备份数据资料
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- 浅析Oracle PL/SQL 学习--未完待续
这是一篇关于Oracle Pl/SQL数据库编程的课程学习分享... 首先说明几点: 学习这门课程之前,已经学过并且掌握一些基础的SQL语句.数据库结构分析.ER图设计等知识: 这里也只是较为大概地将 ...
- Oracle PL/SQL学习之Hello World(0)
1.PL/SQL是Oracle数据库的一大创举,让一些复杂繁琐的常规主流编程代码做的编码处理过程,只需要在PL/SQL中使用简短的几句代码就可以解决,并且准确高效.那么遵循惯例,我们学习PL/SQL编 ...
- [Oracle] PL/SQL学习笔记
-- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...
- PL/SQL学习(六)触发器
原文参考:http://plsql-tutorial.com/ 创建语法: CREATE [OR REPLACE ] TRIGGER trigger_name {BEFORE | AFTER | IN ...
- PL/SQL学习(五)异常处理
原文参考:http://plsql-tutorial.com/ 组成: 1) 异常类型 2) 错误码 3) 错误信息 代码结构: DECLARE Declaration section BEGIN ...
- PL/SQL学习(四)存储过程和函数
原文参考:http://plsql-tutorial.com/ PL/SQL存储过程 存储过程相当于一个有名字的PL/SQL块,经过第一次编译后再次调用时不需要再次编译 创建格式: CREATE [O ...
随机推荐
- 关于char是否能表示一个中文
char是可以表示中文的 这个问题点有3个考核点 1 char是多少位的 2 java用的是什么方式表示字符 3 Unicode是用多少位表示的 1的答案是16位的,2的答案是Unicode,3的答案 ...
- 最全总结 | 聊聊 Python 办公自动化之 PPT(中)
1. 前言 上一篇文章简单地介绍了 PPT 的文档结构,并使用 python-pptx 这个依赖库完成对 PPT 文档最基本的操作 最全总结 | 聊聊 Python 办公自动化之 PPT(上) 作为 ...
- 为什么Java中lambda表达式不能改变外部变量的值,也不能定义自己的同名的本地变量呢?
作者:blindpirate链接:https://www.zhihu.com/question/361639494/answer/948286842来源:知乎著作权归作者所有.商业转载请联系作者获得授 ...
- mysql8.0.19压缩版安装
1.官网下载.zip格式的MySQL Server的压缩包,选择x86或x64版,并解压. 2. 创建 data文件夹 及 my.ini文件,并编辑 [mysqld] # 设置为自己MYSQL的安装目 ...
- QtCreator使用技巧
快捷键 "F4" 在同名的头文件和源程序文件之间切换 "F2" 跟踪光标下的符号,若是变量,可以跟踪到变量声明的地方:若是函数体或函数声明,可以在两者之间切换. ...
- linux操作系统可以ping通ssh连接长时间无响应
一.问题描述 某集群数据节点服务器频繁无法连接,服务器间出现可ping通但ssh无法连接的情况,使用带外地址登录后远程控制也无法显示正常界面,重启后会短暂恢复. 二.排查问题 重启服务器后检查服务器S ...
- 阿里云centos7[linux]安装nginx
标题 说明 服务器版本 Centos7 x64 nginx版本 1.19.6 作者 walton 一.准备 创建安装包目录并进入 mkdir /usr/dev/nginx cd /usr/dev/ng ...
- Mysql-Incorrect string value
[问题描述] com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9F\x8E\x8 ...
- 深入汇编指令理解Java关键字volatile
volatile是什么 volatile关键字是Java提供的一种轻量级同步机制.它能够保证可见性和有序性,但是不能保证原子性 可见性 对于volatile的可见性,先看看这段代码的执行 flag默认 ...
- (一)React Ant Design Pro + .Net5 WebApi:先搞定服务器,顺手装个Nginx
腾讯云搞定服务器,具体过程就不赘述了,文档都有,咨询客服或者自行百度,体验一下过程. 一. 服务器 1. 云服务器 cvm 1核2G centos8.0 2. 域名注册 www.homejok.com ...