关键字(1)

伪表dual

raise_application_error 捕获异常

SQLCODE返回Oracle错误的序号,而SQLERRM返回的是相应的错误消息

当一个事务回滚到一个savepoint,发生下列事件:

1)Oracle仅回滚savepoint之后的语句。
2)Oracle保留这一savepoint,但所有建立于此后的savepoints丢失。
3)Oracle释放在该savepoint后获得的所有表、行锁,但保留之前获得的所有锁。 事务保持活动并可继续。 无论何时一个会话在等待事务,到savepoint的回滚不会释放行锁。为了确保事务如果无法获得锁也不会悬挂(hang),在执行UPDATE或DELETE前使用FOR UPDATE ... NOWAIT。(这里指回滚的savepoint之前获得的锁。该savepoint后获得的行锁会被释放,之后执行的语句也会被彻底回滚。)

注意:
1.savepoint 名字保持唯一
2.如果后面新设置的一个savepoint的名字和前面的一个savepoint名字重复,前一个savepoint将被取消
3.设置savepoint后,事务可以继续commit,全部回退或者回退到具体一个savepoints
4.撤销的处理必须是在没有发出commit命令的前提下才能有效。
 
 
bulk collect可以将查询结果一次性地加载到collections中。而不是通过cursor一条一条地处理(通过bulk collect减少loop处理的开销,使用Bulk Collect提高Oracle查询效率)。
可以在select into,fetch into,returning into语句使用bulk collect。注意在使用bulk collect时,所有的into变量都必须是collections.通过上面的测试和分析,我们可以看到Bulk Collect批查询在某种程度上可以提高查询效率,它首先将所需数据读入内存,然后再统计分析,这样就可以提高查询效率。但是,如果Oracle数据库的内存较小,Shared Pool Size不足以保存Bulk Collect批查询结果,那么该方法需要将Bulk Collect的集合结果保存在磁盘上,在这种情况下,Bulk Collect方法的效率反而不如其他两种方法,有兴趣的读者可以进一步测试。另外,除了Bulk Collect批查询外,我们还可以使用FORALL语句来实现批插入、删除和更新,这在大批量数据操作时可以显著提高执行效率。
 
for update
该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。


原文地址:https://www.cnblogs.com/bitter-first-sweet-last/p/3972792.html