使用PL/SQL将数据从file.txt导入表Oracle SQL
我正在尝试从c:\Dir读取txt类型的文件,并将内容插入表Oracle Sql中使用PL/SQL将数据从file.txt导入表Oracle SQL,oracle,plsql,oracle-sqldeveloper,Oracle,Plsql,Oracle Sqldeveloper,我正在尝试从c:\Dir读取txt类型的文件,并将内容插入表Oracle Sql中 set SERVEROUTPUT ON CREATE OR REPLACE DIRECTORY MYDIR AS ' C:\dir'; DECLARE vInHandle utl_file.file_type; eNoFile exception; PRAGMA exception_init(eNoFile, -29283); BEGIN BEGIN vInHandle := u
set SERVEROUTPUT ON
CREATE OR REPLACE DIRECTORY MYDIR AS ' C:\dir';
DECLARE
vInHandle utl_file.file_type;
eNoFile exception;
PRAGMA exception_init(eNoFile, -29283);
BEGIN
BEGIN
vInHandle := utl_file.Fopen('MYDIR','attachment.txt','R');
dbms_output.put_line('The File exists');
EXCEPTION
WHEN eNoFile THEN
dbms_output.put_line('The File not exists');
END;
END fopen;
/
我有一个不存在的文件,但我有这个文件,我不知道在你发布的第一条语句中,目录名前面的空格是否会起作用(或者只是一个输入错误),但是-尽管如此,通常是这样做的 在硬盘上创建目录:
C:\>mkdir c:\dir
作为SYS
连接到数据库(因为它拥有数据库和目录);创建目录(Oracle对象)并向将使用该目录的用户授予权限:
C:\>sqlplus sys as sysdba
SQL*Plus: Release 11.2.0.2.0 Production on ╚et O×u 5 18:34:43 2020
Copyright (c) 1982, 2014, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
SQL> create or replace directory mydir as 'c:\dir';
Directory created.
SQL> grant read, write on directory mydir to scott;
Grant succeeded.
SQL>
你不需要这个,因为你已经有了这个文件;我将通过假脱机表内容来创建它
SQL> connect scott/tiger
Connected.
SQL> spool c:\dir\example.txt
SQL> select * From dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> spool off;
SQL> $dir c:\dir\*.txt
Volume in drive C is OSDisk
Volume Serial Number is 7635-F892
Directory of c:\dir
05.03.2020. 18:39 539 example.txt
1 File(s) 539 bytes
0 Dir(s) 290.598.363.136 bytes free
SQL>
最后,重用您编写的代码:
SQL> set serveroutput on
SQL>
SQL> DECLARE
2 vInHandle utl_file.file_type;
3 eNoFile exception;
4 PRAGMA exception_init(eNoFile, -29283);
5 BEGIN
6 BEGIN
7 vInHandle := utl_file.Fopen('MYDIR','example.txt','R');
8 dbms_output.put_line('The File exists');
9 EXCEPTION
10 WHEN eNoFile THEN
11 dbms_output.put_line('The File not exists');
12 END;
13 END fopen;
14 /
The File exists
PL/SQL procedure successfully completed.
SQL>
工作正常(祝贺你,你编写的代码确实有效!)
那么,你做错了什么
- 正如我所说的,
前面的空格:c:\dir
将目录MYDIR创建或替换为“c:\dir”代码>
- 数据库不在您的计算机上,而是在单独的数据库服务器上
- 这意味着您可能创建了目录,但它指向数据库服务器上的
目录,而不是您自己的PC李>c:\dir
- 这意味着您可能创建了目录,但它指向数据库服务器上的
您可能需要考虑的另一个选项是使用<强> SQL加载器< /强>。它是一个操作系统实用程序,与数据库或(完整的,非即时的)客户端软件一起安装。它的优点是它在本地PC上运行(即,您不必访问数据库服务器),而且速度非常快。您需要创建一个控制文件,告诉Oracle如何加载存储在源(.txt)文件中的数据
另一个在后台使用SQL加载器的选项是使用外部表。它是指向源(.txt)文件的另一个Oracle对象,允许您使用简单的SQL
SELECT
语句访问它。可能的缺点:它仍然需要访问Oracle目录(就像您的UTL\u文件
选项一样)。您的Oracle数据库可以看到您的C驱动器吗?对不起,我没有取消重新启动,C驱动器是什么意思?您试图读取的文件位于C:\dir
上。我想那是你个人电脑上的一个位置,对吗?Oracle数据库是否也托管在您的个人计算机上?否则,它将无法访问该文件。@JoshEller这不一定是真的;只要数据库服务器具备必要的权限,就可以通过挂载/映射来查看目录。是否值得在数据库服务器上安装特定的c:\驱动器完全是另一回事@博内斯特公平点,我只是假设这里的情况不太可能是这样