将CSV导入Oracle数据库

时间:2017-01-24 07:29:36

标签: plsql

有人可以帮我解决将.CSV文件导入Oracle表的plsql存储过程吗?想要创建一个接受文件名和表名的程序。

注意:我使用的是UTF-8文件格式

3 个答案:

答案 0 :(得分:1)

存储在数据库中的pl / sql过程无法在桌面上运行。你可以

  • 为此目的使用SQL*Loader实用程序
  • 编写一个程序,该程序将读取并解析文件并在表中插入数据
  • 将文件发送到您的数据库可以访问的地方,并使用例如external table或写一些程序来阅读文件(如答案中的get_file

答案 1 :(得分:0)

您必须创建一个目录,并将其指向您拥有该文件的文件夹。 (您需要创建该权限的权限)

create or replace procedure get_file (p_dir varchar2, p_file varchar2) 
is
 line varchar2(4000);
v_file utl_file.file_type;
begin
    v_file := utl_file.fopen(p_dir,p_file,'R');
    loop
         utl_file.get_line(v_file,line);
        -- insert code here
         dbms_output.put_line(line);
    end loop;
    exception when others then
           -- The only way to know when we reach the end of the file is to get and exception
           utl_file.fclose(v_file);
end;

答案 2 :(得分:0)

我认为简单的方法是使用外部表。这是一个像桌子一样对待但是他从文件中读取数据的对象。为了实现这一点,你需要特权创建任何目录。 所以首先创建directort:

CREATE OR REPLACE DIRECTORY imp_data AS 'c:\tmp\'; 

或服务器上的任何其他路径目录。接下来你需要授予它

GRANT READ, WRITE ON DIRECTORY imp_data TO PUBLIC;

现在是最好的部分:)

CREATE TABLE imp_data (
  ID NUMBER(20),
  NAME VARCHAR2(50),
  CITY VARCHAR2(200)
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER --this is the read-file driver
  DEFAULT DIRECTORY imp_data
  ACCESS PARAMETERS
    RECORDS DELIMITED BY NEWLINE
    BADFILE 'bad'
    LOGFILE 'log'
    FIELDS TERMINATED BY ',' -- CSV terminate mark
    (ID, NAME, CITY)) -- the order of the columns in the file
  LOCATION ('dane.csv')) -- name of file
 PARALLEL 5
 REJECT LIMIT 200; -- numbers of bad row before break import