一、事务
1、ACID,原子性(事务内不可分),一致性(完整性约束),隔离性(事务间独立),持久性(保存事务)。
2、事务内语句
提交:commit [work] [comment text];
回滚:rollback [work][to[saveporint] savepoint_name];
保存点:savepoint savepoint_name;
锁表:lock table table_list in loack_mod mode [nowait];使用数据库默认的锁行为,最后考虑使用显式锁。
3、事务外语句
set transaction read only,事务开始后,如果有其他事务A提交,A事务对本事务不可见,本事务不能执行DML语句。
set transaction read write,事务开始后,如果有其他事务A提交, A事务对本事务可见 。(默认)
set transaction isolation level serializable,事务串行化级别, 事务开始后,如果有其他事务A提交, A事务对本事务不可见 。 但是如果本事务修改A事务已经修改还未提交的数据,本事务被阻塞。本事务如果需要修改一个A事务已经修改并提交的数据,则会抛出异常。(set transaction read only的增强版)
set transaction isolation level read committed,默认, 事务开始后,如果有其他事务A提交, A事务对本事务可见 ,如果本事务修改A事务已经修改还未提交的数据,本事务被阻塞。本事务如果需要修改一个A事务已经修改并提交的数据,正常。(等于set transaction read write)
set transacton use rollback segment rollback_segname,9i后废弃。
4、自治事务,在pl/sql块的声明部分添加pragma autonomous_transacton,记住显式的提交或回滚。
5、事务异常且没有提交和回滚,只对没有nocopy的out和in out参数回滚,全局数据结构和数据库对象的修改不回滚。
6、事务中执行每一个DDL,先隐式执行commit。
7、事务中执行每一个DML,先隐式执行savepoint auto_name ,异常后只是rollback to auto_name。
二、游标
1、隐式游标,select ... into , for .. in select ...;
2、显式游标,cursor[(arg...)][return ...] ... is select ... ;
3、游标变量,type ref_cursor is ref cursor [return ...]; open ref_cursor for select ...;
4、加锁读取, select ... for update [of [column_list]],可以在dml中使用where current of cursor_name表示游标当前行。
5、显式游标的使用,declare,open,fetch,close。
6、9i后,系统预定义的弱类型ref cursor叫sys_refcursor.
三、动态SQL和动态PL/SQL
方式:
1、execute immediate sql_string [into {define_variable_list|record}] [using [in|out|in out] bind_argument ...];
2、open cursor_variable for sql_string [using bind_argument ...];
3、dbms_sql;
特性:
1、带有重复占位符的绑定变量,动态SQL每个都要绑定,动态PL/SQL只绑定名称不同的变量。
2、动态PL/SQL类似一个独立的程序块,只能访问全局范围的元素,和宿主没有直接的关系。异常处理除外。
3、最后再考虑dbms_sql,一定要用吗?
4、11g后可以在游标变量和DBMS_SQL间转换,dbms_sql.to_refcursor,dbms_sql.to_cursor。
5、只有execute immediate才支持动态PL/SQL。语句最后需要有‘;‘。