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;
绑定变量
  1. 通过占位符绑定参数

  2. 参数类型可以是集合、对象等

  3. 不支持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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值