您的位置:首页 > 数据库

PL/SQL更改数据和管理事务

2014-06-05 12:24 423 查看
①在PL/SQL中使用DML

DML语句即UPDATE,DELETE,INSERT.

1)DML操作的游标属性

当从PL/SQL中执行一条select语句时,Oracle数据库管理系统会为该语句分配一个私有的工作区(包含了该语句的信息以及结果集的信息),同时并将查询的结果集放入系统全局区,Oracle中使用游标作为指针来引用该私有工作区

隐式游标的相关属性:

SQL%FOUND 如果记录成功获取,返回TRUE,否则返回FALSE.

SQL%NOTFOUND 如果记录获取失败,返回TRUE,否则返回FALSE.

SQL%ISOPEN 总是返回FALSE.—因为是在我们当时使用时打开,之后自动关闭,所以总是返回FALSE.

例:

select * from scott.emp
declare
begin
delete from scott.emp where sal<=2000;
if sql%found then
 dbms_output.put_line('被开除的员工共有'||sql%rowcount||'人');
 end if;
end;


2)DML语句的returning子句

例:

declare 
    v_ename scott.emp.ename%type;
    v_sal scott.emp.sal%type;
begin
    for rec in (selectempno,ename,sal from scott.emp)
    loop
        update scott.emp setsal = sal*2 whereempno = rec.empno
          returning ename,sal intov_ename,v_sal;
        dbms_output.put_line('员工'||v_ename||'工资ª'||v_sal);
    end loop;
end;


②使用forall语句的批量DML

Forall语句的语法形式如下:

Forall index in lower_bound .. upper_bound

Sql语句;

其中,index为隐含定义的整数变量,作为集合元素的下标使用;lower_bound和upper_bound分别是集合元素的上界和下界.

*forall语句的主体必须是单个的insert,update或delete语句.

1) 在insert语句用批量绑定

create table demo(  --创建一个demo表
dname varchar2(10),
dsal number(7,2)
);
declare 
       type dname_table_type istable of varchar2(10) index by binary_integer;  --定义表类型和表变量
       type dsal_table_type istable of varchar2(10) index by binary_integer;
       dname_table dname_table_type;
       dsal_table dsal_table_type;
begin 
      for i in 1..10 --用循环给表变量赋值
      loop
      dname_table(i) := 'a'||to_char(i);
      dsal_table(i) := i*100;
      end loop;
      forall i in 1..dname_table.count   --将两个表变量中的数据批量绑定插入到demo中
      insert into demo
      values(dname_table(i),dsal_table(i));
end;
select * from demo;


结果为:

③PL/SQL中的数据库事务管理

1)数据库事务的概念

* Oracle将一组SQL语句组成的一个逻辑工作单元看作一个数据库事务

* 一个逻辑工作单元包含四个属性: ACID(原子性,一致性,隔离性,持久性
)

原子性: 指事务是一个不可分割的工作单元,即事务中包含的所有操作要么全做,要么都不做;

一致性: 指事务必须使系统从一个一致性状态变换到另一个一致性状态,即事务的总体上不能破坏特定环境下的任何业务规则,如转账的两个账号里的钱总和要保持不变;

隔离性: 指定的每个事务必须独立于其它事务执行,并且事务中的操作同时发生即活动的事务所做的改变对并发运行的其它事务来说是不可见的;

持久性: 确保事务完成后,对数据的修改是永久性的,即使接下来发生系统故障也不会对其有任何影响.



PL/SQL提供了如下的语句来管理事务:

l COMMIT:
提交所有的改变到数据库,释放锁定的资源,

l ROLLBACK:
回滚所有的改变,释放锁定的资源.

l ROLLBACK TO S***EPOINT:
回滚到指定的保存点,释放保存点范围内锁定的资源

l S***EPOINT:
设置一个保存点,可以回滚到此点.

l SET TRANSACTION:
允许我们开始一个只读或可读写的会话,建立隔离级别,或分配当前的事务到一个指定的回滚段.

l LOCK TABLE:
允许我们使用指定的模式锁住整个数据库表,它将覆盖默认的行级锁.



例子:

createtable demo(
empnoint ,
enamevarchar2(10),
salnumber(6,2)
)
begin
--第一个事务开始
insertinto demo values(9999,'name1',1000.00);
commit;
--第一个事务结束,第二个事务开始
deletefrom demo where empno='9999';
savepointa;
insertinto demo values(8888,'name2',1200.00);
rollbackto savepoint a;
insertinto demo values(7777,'name3',1310.00);
commit;
end;
select* from demo;




3)数据库中的锁

SHARE(S锁):
共享锁,某事务使用s锁锁住该表,只允许使用该表即查,不能修改;

EXCLUSIVE(X锁):
排他锁, 事务对表加了X锁后,不再允许其它事务锁定该表;

ROWSHARE(RS锁),行级共享锁,对相应行加上RS锁后,仍然允许其他事务加RS锁.

ROWEXCLUSIVE(RX锁):
行级排他锁, 对相应行加上RX锁后,其他事务不能再对该表加锁.

SHARE ROWEXCLUSIVE(SRX锁):
共享行级排他锁, 对相应行加X锁,但对表加S锁,所以可以让别的事务对其他行加入X锁.



*在执行INSERT,UPDATE,DELETE语句时,自动产生行级排他锁(RX锁);

*在执行CREATE 语句时,自动产生共享(S锁);

*在执行ALTER语句时,自动产生排他锁(X锁).
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: