前面介绍了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 |