oracle - 使用 PL/SQL 将数据从 file.txt 导入 Oracle SQL 表
问题描述
我正在尝试从 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 := 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
:CREATE OR REPLACE DIRECTORY MYDIR AS ' C:\dir';
- 数据库不在您的计算机上,而是在单独的数据库服务器上
- 这意味着您可能创建了目录,但它指向
c:\dir
数据库服务器上的目录,而不是您自己的PC!
- 这意味着您可能创建了目录,但它指向
正如 Boneist 评论的那样,可以在不是数据库服务器的计算机上创建一个目录(Oracle 对象),但这不是我们通常做的事情。如果您选择此选项,则必须在创建目录时使用 UNC(通用命名约定)。
您可能要考虑的另一个选项是使用SQL Loader。它是一个操作系统实用程序,与数据库或(完整的,非即时的)客户端软件一起安装。它的优点是它可以在您的本地 PC 上运行(即您不必访问数据库服务器)并且速度非常快。您将创建一个控制文件,告诉 Oracle 如何加载存储在源 (.txt) 文件中的数据。
另一个在后台使用 SQL Loader 的选项是使用外部表。它是另一个 Oracle 对象,它指向源 (.txt) 文件并允许您使用简单的 SQLSELECT
语句访问它。可能的缺点:它仍然需要访问 Oracle 目录(就像您的UTL_FILE
选择一样)。
推荐阅读
- selenium - 使用 Selenium Webdriver 启动后,Google chrome 会自动关闭
- css - 火狐开发工具问题
- scala - 如何使用 Scala sbt 查找并安装它们?
- elasticsearch - elasticsearch查询中的(来自/大小)不返回预期的文档
- jqgrid - 单元格未与标题对齐 - JQGrid
- postgresql - postgres psql 显示格式
- c# - 当控制器在另一个项目中时,获取方法不返回值
- maven - Nexus 无法访问已配置的代理存储库,例如 Maven Central
- javascript - 如何按需加载单独的文件?
- java - Elasticsearch 检索 ZonedDateTime - 无法将源 [{}] 映射到类