2011年7月16日土曜日

[SQLPLUS] Copy命令

Append - 向已有的目标表中追加记录,如果目标表不存在,自动创建,这种情况下和Create等效。
Create - 创建目标表并且向其中追加记录,如果目标表已经存在,则会返回错误。
Insert - 向已有的目标表中插入记录,与Append不同的是,如果目标表不存在,不自动创建而是返回错误。
Replace - 用查询出来的数据覆盖已有的目标表中的数据,如果目标表不存在,自动创建。

- 好处
-- 直接在不同数据库中进行拷贝动作,比传统方法需建DBLINK更方便易用多了。
-- DBLINK一旦建立,如果出于安全考虑,很可能要删除掉,否则会留下安全隐患(想着想着多想了一个理由)。
-- CREATE TABLE XXX AS SELECT * FROM XXX@dblink或
-- insert into table select *from xxx@dblink的方法必须要保证目标表没有该表或者已经有该表,而COPY APPEND,REPLACE不存在自动创建,有存在则自动插入,灵活的多。(如果要判断了选择CRDATE,INSERT,可让我们有选择的余地)             
-- 在已经有数据的情况下,SQLPLUS的APPEND命令追加,比INSERT INTO SELECT 高效
-- 如果不考虑性能,比如只是实时同步两库的参数配置小表,那在SHELL中批量写COPY+REPLACE语句,CRONTAB定时同步,就可以保证两库配置表是基本一致的,这个在大表不实用,在小表就一定大有用武之地!(这个是在自己多次反复同步配置表后,无意想到的)

- 注意点
-- 这些都是直接路径读,所以COPY+APPEND,INSERT也是直接提交成功的,所有的动作操作后都无法回滚。
-- 虽然主要适用于不同库之间,但是在同一库不同用户也使用,甚至同一库同一用户也一样(同用户表名要不一样),就是FROM TO写好则可。
-- 写法习惯要注意,COPY+CREATE 后面不要增加TABLE的关键字,经常收到ORACLE语法误导,会多写了这个。
-- 不支持sysdba和sysoper的操作

- 操作
copy from go/go@rscdb to go/go@descdb create tt using select db_key from db where rownum = 1;

0 件のコメント:

コメントを投稿