Oracle10g新增了DBMS_FILE_TRANSFER包,通过数据库的功能实现了文件的传输。
这篇介绍GET_FILE和PUT_FILE过程。
前面介绍了COPY_FILE,这里介绍这个包的另外两个过程,GET_FILE和PUT_FILE。这两个过程的功能和FTP的get和put命令是否类似,就是利用数据库的功能将文件在两个数据库服务器之间进行拷贝。和COPY_FILE过程唯一不同之处在于,GET_FILE和PUT_FILE过程多了一个参数,这个参数用来指定数据库链信息。
[oracle@yanttest ~]$ export ORACLE_SID=testzj
[oracle@yanttest ~]$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on星期四5月7 15:31:47 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
SQL> select directory_path
2 from dba_directories
3 where directory_name = 'D_OUTPUT';
未选定行
SQL> create directory d_output as '/home/oracle';
目录已创建。
SQL> grant read, write on directory d_output to test;
授权成功。
在远端数据库做好DIRECTORY的准备工作。
bash-2.03$ sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.3.0 - Production on星期六3月7 19:15:24 2009
Copyright (c) 1982, 2006, Oracle. All Rights Reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Data Mining options
SQL> grant execute on dbms_file_transfer to test;
授权成功。
SQL> grant read, write on directory d_output to test;
授权成功。
SQL> conn test/test已连接。SQL> create database link testzj
2 connect to test
3 identified by test
4 using '172.25.13.231/testzj';
数据库链接已创建。
SQL> begin
2 sys.dbms_file_transfer.put_file(
3 'D_OUTPUT',
4 'spfiletestrac.ora',
5 'D_OUTPUT',
6 'spfiletestzj.ora',
7 'TESTZJ');
8 end;
9 /
PL/SQL过程已成功完成。
已经将本地/export/home/oracle目录下的spfiletestrac.ora文件拷贝到远端站点,下面在利用GET_FILE,从远端读取文件:
SQL> begin
2 sys.dbms_file_transfer.get_file(
3 'D_OUTPUT',
4 'spfiletestzj.ora',
5 'TESTZJ',
6 'D_OUTPUT',
7 'spfiletestrac.bak');
8 end;
9 /
PL/SQL过程已成功完成。
需要注意,这个过程的执行要求本地数据库和远端数据库的版本都是10g以上,否则会出现错误:
SQL> create database link testdata94.emedchina.com
2 connect to test
3 identified by test
4 using '172.25.88.94/testdata';
数据库链接已创建。
SQL> select * from v$version@testdata94.emedchina.com;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for Linux: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
SQL> col directory_path format a50
SQL> set pages 100 lines 120
SQL> select directory_name, directory_path from all_directories@testdata94.emedchina.com;
DIRECTORY_NAME DIRECTORY_PATH
------------------------------ --------------------------------------------------
DIR_TEST /home/oracle/test
D_TEST /data/oradata/testdata
SQL> exec sys.dbms_file_transfer.put_file('D_OUTPUT', 'spfiletestzj.ora', 'D_TEST', 'spfiletestzj.ora', 'TESTDATA94.EMEDCHINA.COM')
BEGIN sys.dbms_file_transfer.put_file('D_OUTPUT', 'spfiletestzj.ora', 'D_TEST', 'spfiletestzj.ora', 'TESTDATA94.EMEDCHINA.COM'); END;
*第1行出现错误:
ORA-03115:不支持的网络数据类型或表示法ORA-02063:紧接着line (起自TESTDATA94.EMEDCHINA.COM)
ORA-06512:在"SYS.DBMS_FILE_TRANSFER", line 60
ORA-06512:在"SYS.DBMS_FILE_TRANSFER", line 168
ORA-06512:在line 1