暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 更改数据:插入、更新、合并和删除

自学Oracle 2018-06-28
601

插入

1、用select插入

insert into test select * from test;

2、使用append提示改善插入性能

append提示将使数据库查找已经被插入表中数据的最后一个块,新的记录将从表的高水位线之上新分配的extent中的第一个块开始插入。此外,插入的数据将直接写入数据文件中,而不是先进入数据块缓存。因此,在插入期间对数据库进行的空间管理工作就很少了。于是,在使用append提示时,插入操作会进行的很快。

insert  *+append+*/ into test select * from test;

重置高水位标记的唯一方法是把表截断(truncate)。因为truncate将删除所有的记录并且不能回滚,所以应该确保在执行truncate操作之前该表有数据备份。

3、rollback、commit和autocommit命令

show autocommit;

默认是off,也可以为autocommit指定一个数值,该值将确定在几条命令后Oracle将执行commit。

rollback 回滚未被提交的工作。

4、使用savepoint

savepoint a;

insert into ...

savepoint b;

delete .....

rollback to savepoint a;

5、隐式提交

即使没有直接下达提交命令,有些操作(如quit,exit(等价于quit))以及任意数据定义语言(DDL)的命令也会强制提交发生,使用这命令会强制提交事务。

6、自动回滚

如果机器或数据库发生故障,oracle将自动回滚,完成一次数据库的恢复的清理工作。

7、多表插入

可以在一个命令中执行多个插入。可以无条件地执行所有的插入,也可以指定条件执行插入(用when子句告诉oracle怎样控制多个插入)。如果指定all,将判定所有的when子句;若指定first,则告诉oracle,在它找到一个判定结果为真的when子句后将忽略后面的when子句。还可以用else子句告诉oracle,当when子句的判定结果没有一个为真时应该进行什么操作。

insert all 

            into test (aa,bb,cc) values(aa,bb,'cc')

            into test (aa,bb,cc) values(aa,bb,'dd')

            into test (aa,bb,cc) values(aa,bb,'ee')

select aa,bb,cc from test;

-------------------------------------------------------------------------

insert first

            when aa>5 then into test (aa,bb,cc) values(aa,bb,'cc')

            when bb>6 then into test (aa,bb,cc) values(aa,bb,'dd')

            when cc is not nulll then into test (aa,bb,cc) values(aa,bb,'ee')

            else into test2

select aa,bb,cc from test;


删除delete

delete from  test where aa>5;

删除记录的另一个命令是truncate,它与delete不同。delete可以提交或回滚删除操作,而truncate自动地删除表中的所有记录,truncate命令的操作结果不能被回滚或提交,截除的记录不能恢复。不能依靠闪回查询查看被截除的数据。


更新update

1、用嵌入式select进行更新

update test set (aa,bb)=(select cc,dd from test2 where mm>1) where cc=5;

2、用null更新

update test set aa = null where bb=0;

这是null与等号而不是与关键字is一起使用的唯一示例。


合并merge

可以在单个命令中使用merge命令对单个表执行insert 和update 操作。

merge into test t1  

using (select aa,bb,cc from test2) c2 on (t1.aa=t2.aa and t1.bb=t2.bb)

when matched then update set cc=t2.cc

where not matched then insert (t1aa,t1.bb,t1.cc) values(t2.11,t2.bb,t2.cc);

注意:不能更新on条件子句总引用的列。


处理错误

使用错误日志表,并在命令中使用特定语法告诉数据库如何处理错误。之后oracle会自动将失败条目及它们失败的原因记录到日志中。

oracle 在dms_errlog程序包中create_error_log的过程,创建错误日志。

create_error_log过程的参数
参数描述
dml_table_name在其上创建错误日志表的那个表的名称。此名可以被完全限定(例如,bookshelf或practice.bookshelf)。如果名称用双引号引起来,它将是大写字母形式
err_log_table_name将要创建的错误日志表的名称。默认名称是DML表名的前25个字符,且使用“ERR$_”前缀(如ERR$_TEST)
err_log_table_owner错误日志表的所有者的名称。可以在dml_table_name参数中指定此所有者。否则,使用当前连接用户的模式
err_log_table_space将要在其中创建错误日志表的表空间。如果未指定此参数,则使用拥有错误日志表的用户的默认表空间
skip_unsupported当此参数设置为true时,忽略错误日志不支持的列类型,且不添加到错误日志表中。当此参数设置为false(默认设置)时,不支持的列类型将会到导致该过程终止

创建   execute dbms_errlog.create_error_log('test','errlog');

对错误进行重定向

insert into test (aa,bb,cc) select * from test2 log errors into errlog('from_order') reject limit 10;

可以使用regect limit 子句来指定在insert 命令失败之前可以记录到日志中的错误数量的上限。默认是0,也可以将它设置为unlimited。

如果在insert 执行期间遇到错误,那么这些错误将会被写到errlog表中,并按照程序清单中log errors 子句的执行,用“from_order”值标记他们。errlog表还有另外两列:

  • ORA_ERR_MESG$:它包含Oracle错误消息号,=和错误的消息文本。

  • ORA_ERR_TAG$:它包含into子句中指定的标记,如前面的程序清单所示。

不能在错误日志表中记录long、lob会对象类型列的错误。但是DML操作的目标表可以包含这些类型的列。


本公众号是个人学习工作笔记,希望大家发现问题能及时和我本人沟通,希望你与我共同成长。个人微信zgtj12306。

 

欢迎关注“自学Oracle”


文章转载自自学Oracle,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论