• 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
  • 相关阅读:
    安全工具-Arachni
    Python读取本地文档内容并发送邮件
    Linux好用的工具命令
    kali 安装google chrome浏览器(离线手动)
    安全工具-Sparta
    安全工具-Hydra
    当年的程序员,如今已是父母,七个方法让孩子爱上学习!
    一个网站SEO优化方案
    发现2017年最好的CSS框架
    怎么样加快JavaScript加载和执行效率
  • 原文地址:https://www.cnblogs.com/aixing/p/13327694.html
Copyright © 2020-2023  润新知