读取文本文件以将数据插入 Oracle SQL 表

Posted

技术标签:

【中文标题】读取文本文件以将数据插入 Oracle SQL 表【英文标题】:Read text file to insert data into Oracle SQL table 【发布时间】:2013-01-27 05:14:16 【问题描述】:

我正在学习 Oracle SQL 开发人员。

我正在做的是从文件夹中逐行读取文本文件。 然后将数据插入到 SQL 表中。

我能够编译我的 PROCEDURE,但是它似乎没有将数据插入到文件中。

Create or Replace PROCEDURE Rfile is
f UTL_FILE.FILE_TYPE;
s VARCHAR2(200); 
BEGIN
f := UTL_FILE.FOPEN('C:\Projects\','testdatabinary.txt','R');
  IF UTL_FILE.IS_OPEN(f) THEN
    LOOP
      BEGIN
        UTL_FILE.GET_LINE(f,s);
        IF s IS NULL THEN
          EXIT;
        END IF;
      INSERT INTO DATAINSERT
      (COLUMN1, COLUMN2)
      VALUES
      (s, 'testdatabinary');
      END;
  END LOOP;
  COMMIT;
  END IF;
 END;

我有一个带有两个 varchar(200) 类型 cols 的表 DATAINSERT

我不太确定 PROCEDURE 没有向表中插入数据的原因

我刚刚检查了错误消息

Error starting at line 1 in command:
EXEC Rfile
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at "SYSTEM.RFILE", line 5

【问题讨论】:

你的第一行是NULL吗?您可以使用 dbms_output.put_line(s) 来查看它正在读取的内容。 不是,是目录路径的问题。我检查并准确复制并粘贴了文件目录:(。但是,它仍然存在问题 服务器上是否存在该文件/目录?没有发现代码有任何问题。 是的!所以我创建了像“MYDIR”这样的路径名,然后像 f := UTL_FILE.FOPEN('MYDIR','testdatabinary.txt','R'); 然后我收到类似“01403.00000 - “未找到数据”的错误 【参考方案1】:

不确定是什么导致了问题。对我来说,它的工作正常是我的示例代码


--参考网站 --https://community.oracle.com/thread/3633577?start=0&tstart=0

     set serveroutput on;
     CREATE or replace DIRECTORY USER_DIR AS '/home/oracle'; 
     GRANT READ ON DIRECTORY USER_DIR TO PUBLIC;

     DECLARE 
        V1 VARCHAR2(200); --32767
        F1 UTL_FILE.FILE_TYPE; 
     BEGIN 
        F1 := UTL_FILE.FOPEN('USER_DIR','temp.txt','R'); 
        Loop
        BEGIN
    UTL_FILE.GET_LINE(F1,V1); 
    dbms_output.put_line(V1);
    EXCEPTION WHEN No_Data_Found THEN EXIT; END;
        end loop;

        IF UTL_FILE.IS_OPEN(F1) THEN
     dbms_output.put_line('File is Open');
        end if;

        UTL_FILE.FCLOSE(F1); 
     END; 
     /
    set serveroutput off;

【讨论】:

【参考方案2】:

不能像这样直接输入文件打开命令的路径

f := UTL_FILE.FOPEN('C:\Projects\','testdatabinary.txt','R');

您必须使用以下 sql 查询创建目录,而不是直接输入路径

创建或替换 DIRECTORY USER_DIR AS 'C:\PROJECTS\';

然后在文件打开命令中输入目录名。会是这样的

f := UTL_FILE.FOPEN('USER_DIR ','testdatabinary.txt','R');

【讨论】:

【参考方案3】:

第一个过程试图将文件从 PC 加载到服务器中,而在第二个过程中文件是从服务器到服务器。 UTL_FILE.FOPEN 适用于服务器端 PL/SQL。所以第一个程序不会正确执行...如果你想从 PC 加载文件到服务器,那么你需要使用任何前端,如 D@K 或 VB。

【讨论】:

【参考方案4】:

您在这里犯的错误是使用工作站路径,您实际上需要使用目录路径。

解决此问题的最快方法是使用 WINSCP 命令。

使用 WINSCP 告诉你目录路径是什么,然后简单地用这个新信息替换你代码中的旧路径,一切都会正常。

【讨论】:

【参考方案5】:

这是非常概念化和棘手的。您可以在下面找到更多概念和详细信息: https://ora-data.blogspot.in/2016/11/read-and-writ-text-file-using-UTLFILE.html

肯定会有所帮助:

create or replace procedure read_file is 
f_line varchar2(2000); 
f utl_file.file_type; 
f_dir varchar2(250); 
fname varchar2(50); 
Comma1 varchar(10); 
Comma2 varchar(10); 
Comma3 varchar(10); 
Comma4 varchar(10); 
Comma5 varchar(10); 
f_empno emp.empno%type; 
f_ename emp.ename%type; 
f_job emp.job%type; 
f_mgr emp.mgr%type; 
f_hiredate emp.hiredate%type; 
f_sal emp.sal%type; 
begin 
f_dir := ‘E:\PLSQL’; 
fname := ‘input.txt’; 
f := utl_file.fopen(‘UTL_FILE_DIR’,fname,’r’); –opening the file using fopen function 
loop 
begin 
utl_file.get_line(f,f_line); 
–using a loop continuously get the file’s content using get_line function exception when no_data_found then 
exit; 
end; 

Comma1 := INSTR(f_line, ‘,’ ,1 , 1); 
Comma2 := INSTR(f_line, ‘,’ ,1 , 2); 
Comma3 := INSTR(f_line, ‘,’ ,1 , 3); 
Comma4 := INSTR(f_line, ‘,’ ,1 , 4); 
Comma5 := INSTR(f_line, ‘,’ ,1 , 5);
–Each field in the input record is delimited by commas. 
–We need to find the location of two commas in the line. 
–and use the locations to get the field from the line. 
f_empno := to_number(SUBSTR(f_line, 1, Comma1-1)); 
f_ename := SUBSTR(f_line, Comma1+1, Comma2-Comma1-1); 
f_job := SUBSTR(f_line, comma2+1, Comma3-Comma2-1); 
f_mgr := to_number(SUBSTR(f_line, comma3+1, Comma4-Comma3-1)); 
f_hiredate := to_date(SUBSTR(f_line, comma4+1, Comma5-Comma4-1),’dd-mon-yyyy’); 
f_sal := to_number(SUBSTR(f_line, comma5+1),’99999′); dbms_output.put_line(f_empno ||’ ‘|| f_ename || ‘ ‘ || f_job || ‘ ‘ || f_mgr ||’ ‘ || f_hiredate||’ ‘|| f_sal); 
insert into emp12 VALUES (f_empno,f_ename,f_job,f_mgr,f_hiredate,f_sal); 
end loop; 
utl_file.fclose(f); 

commit; 

end; 

/ 

【讨论】:

【参考方案6】:

第一次登录

用户名:sys 作为 sysdba

密码应与用户“系统”使用的密码相同

现在输入

SQL> 将 UTL_FILE 上的执行权限授予 PUBLIC;

现在使用您要创建过程的任何用户登录

【讨论】:

请说明对答案投反对票的原因 我猜投反对票的原因是您的答案不符合问题? OP 收到的错误消息不是由于缺少 GRANT,而是由于调用不正确。

以上是关于读取文本文件以将数据插入 Oracle SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

并行执行 oracle PL/SQL [重复]

从 .txt 文件读取数据并将其插入 Oracle SQL DB [PL/SQL,Unix 脚本]

Oracle:创建存储过程以将另一个存储过程的结果插入表中

如何将文本文件中的数据从Java插入SQL Server?

Oracle SQL:从大型文本文件运行插入语句

Oracle 11g:从 CLOB 和表更新中读取 XML 记录