COPY命令[转帖]_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3748 | 回复: 0   主题: COPY命令[转帖]        下一篇 
wayne
注册用户
等级:中校
经验:1690
发帖:221
精华:0
注册:2011-7-21
状态:离线
发送短消息息给wayne 加好友    发送短消息息给wayne 发消息
发表于: IP:您无权察看 2011-8-18 13:55:55 | [全部帖] [楼主帖] 楼主

今天同事在使用COPY命令时碰到了一个权限方面的小问题。帮他解决后感觉COPY命令很有用,这里简单总结几句。

COPY是SQLPLUS下的命令,功能很强,语法如下:

COPY FROM user/password@dbname TO user/password@dbname CREATE/APPEND/INSERT/REPLACE TABLE_NAME (COLUMN_NAME, ……) USING SELECT ……


简单描述一下语法:

FROM和TO语句分别描述从哪个数据库COPY到哪个数据库。这两个语句中连接数据库的格式和CONNECT语句后面的连接格式是一致的。FROM或TO指向当前数据库时,可以忽略,但不能同时忽略FROM和TO。

CREATE/APPEND/INSERT/REPLACE:COPY命令的四个选项,功能分别为创建表并插入数据、在已经存在的表的记录后面插入新数据、在空表中插入数据、删除表然后重建新表并插入新数据。

后面是表名和列名,如果列名列表省略的话,则会根据查询语句来确定列的名称。

USING查询,将查询的结果按照指定方法写入表中。

COPY命令的优点很多,这里列举我认为最重要的三条:

支持LONG类型:由于CREATE TABLE AS和INSERT INTO SELECT都不支持LONG类型。这就导致了对LONG类型数据的处理十分麻烦,而使用存储过程的方法相对比较麻烦,利用EXP和IMP则有很多的限制条件。相对来说使用COPY是最简单快速的方法。

不需要建立数据库链,只要本地的TNSNAMES.ORA中配置了远端数据库就可以直接访问。操作方便快捷。而且也支持本数据库到本数据库的COPY。

语法灵活,支持目标表名列名与查询语句中不相符,而且还有多种数据处理方式。

总的来说COPY命令是一个相当好用的命令,下面是一个简单的例子。

SQL> CREATE TABLE T AS SELECT * FROM DBA_TAB_COLUMNS;
CREATE TABLE T AS SELECT * FROM DBA_TAB_COLUMNS
*


ERROR 位于第 1 行:
ORA-00997: 非法使用 LONG 数据类型

SQL> CREATE TABLE T (ID NUMBER, DEFAULT_VALUE LONG);


表已创建。

SQL> INSERT INTO T SELECT ROWNUM, DATA_DEFAULT FROM DBA_TAB_COLUMNS;
INSERT INTO T SELECT ROWNUM, DATA_DEFAULT FROM DBA_TAB_COLUMNS
*


ERROR 位于第 1 行:
ORA-00997: 非法使用 LONG 数据类型

SQL> DROP TABLE T;


表已丢弃。

SQL> COPY FROM YANGTK/YANGTK@TEST TO YANGTK/YANGTK@TEST CREATE T USING SELECT * FROM DBA_TAB_COLUMNS


数组读取/结合的大小为15。(数组大小为15)
将在完成时提交。(提交的复本为 0)
最长为80。(长度为80)
表T已创建。

27128行选自YANGTK@TEST。
27128行被插入T。
27128行已提交至T(位于YANGTK@TEST)。

其中每次读取数据数组大小有SET的ARRAYSIZE参数决定。每次提交的数据量由SET的COPYCOMMIT参数控制。COPY是否进行类型检查由SET的COPYTYPECHECK参数控制。COPY执行时LONG类型截取长度由SET的LONG参数控制。如果不希望LONG类型被截断,则保证LONG的值超过表中LONG类型的最长值。

SQL> SET ARRAYSIZE 1000
SQL> SET COPYCOMMIT 1000
SQL> SET COPYTYPECHECK OFF
SQL> SET LONG 100000
SQL> COPY FROM YANGTK/YANGTK@TEST TO YANGTK/YANGTK@TEST APPEND T USING SELECT * FROM DBA_TAB_COLUMNS


数组读取/结合的大小为1000。(数组大小为1000)
将在每1000个数组结合之后提交。(提交的复本为1000)
最长为100000。(长度为100000)
27128行选自YANGTK@TEST。
27128行被插入T。
27128行已提交至T(位于YANGTK@TEST)。

在使用COPY命令时,尽量只对用户自己的表进行操作。如果需要对其他用户下的表执行REPLACE操作时,仅仅拥有这个表的INSERT、DELETE权限是没有任何作用的,必须拥有CREATE ANY TABLE、DROP ANY TABLE和INSERT ANY TABLE系统权限。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论