在SQL中读取和写入CSV

时间:2018-01-16 16:32:55

标签: sql oracle plsql

在oracle DB中我有一个表,其中包含列id,att1,att2,att3。现在我还有一个CSV文件,里面有很多id以及一个额外的参数。如何插入对应于DB中每个id的att2。 最初,csv就像

   id, random
   id, random
   .
   .

即在运行PL / SQL脚本后,csv文件将如下所示:

   id, random, att2
   id, random, att2
   .
   .
   .

2 个答案:

答案 0 :(得分:0)

UTL_FILE是此类任务的不错选择。

还有另一个选项EXTERNAL TABLE,但您无法使用它写入CSV文件。

确保您拥有CREATE DIRECTORY权限,这是这两个选项最重要的第一步。

请参阅此链接以获取更多详细信息:

https://oracle-base.com/articles/9i/external-tables-9i

答案 1 :(得分:0)

这是一个例子。

作为先决条件,作为特权用户(SYS)连接,我创建了一个指向磁盘上导向器的目录(Oracle对象),为将要使用它的用户授予所需的权限。另外,我在UTL_FILE包上向同一个用户授予EXECUTE。

SQL> connect sys/pwd@xe as sysdba
Connected.
SQL> create directory ext_dir as 'c:\temp';

Directory created.

SQL> grant read, write on directory ext_dir to hr;

Grant succeeded.

SQL> grant execute on utl_file to hr;

Grant succeeded.

SQL>

输入文件名为SPORT.TXT,如下所示:

SQL> $type c:\temp\sport.txt
10,handball
20,football
30,tennis

利用UTL_FILE读取和写入文件的过程创建了SPORT_OUT.TXT文件,该文件在输入文件的前两个值之间插入了另一个值。

它包含评论,我希望您能够遵循执行。

SQL> connect hr/hr@xe
Connected.
SQL> declare
  2    -- input and output file types
  3    l_file_in      utl_file.file_type;
  4    l_file_out     utl_file.file_type;
  5    -- directory object
  6    l_dir          varchar2(30) := 'EXT_DIR';
  7    -- input and output file name
  8    l_filename_in  varchar2(30) := 'sport.txt';
  9    l_filename_out varchar2(30) := 'sport_out.txt';
 10    -- the whole line from the input file
 11    l_text         varchar2(32767);
 12    -- ID from the input file
 13    l_id           varchar2(3);
 14    -- your "random" value from the input file
 15    l_random       varchar2(30);
 16    -- value from a table which will be inserted between L_ID and L_RANDOM
 17    l_dname        departments.department_name%type;
 18  begin
 19    -- open files
 20    l_file_in := utl_file.fopen(l_dir, l_filename_in, 'r', 32767);
 21    l_file_out := utl_file.fopen(l_dir, l_filename_out, 'w', 32767);
 22
 23    -- loop through input file
 24    begin
 25      loop
 26        -- fetch line by line
 27        utl_file.get_line(l_file_in, l_text, 32767);
 28        -- extract ID and "random" value
 29        l_id := substr(l_text, 1, instr(l_text, ',') - 1);
 30        l_random := substr(l_text, instr(l_text, ',') + 1, 30);
 31
 32        -- select value from DEPARTMENTS that matches the L_ID value
 33        select max(department_name )
 34          into l_dname
 35          from departments
 36          where department_id = l_id;
 37
 38        -- write line into the output file
 39        utl_file.put_line(l_file_out, l_id ||','||l_dname||','||l_random);
 40      end loop;
 41    exception
 42      when no_data_found then
 43        null;
 44    end;
 45    -- close files
 46    utl_file.fclose(l_file_in);
 47    utl_file.fclose(l_file_out);
 48  end;
 49  /

PL/SQL procedure successfully completed.

让我们检查一下结果:

SQL> $type c:\temp\sport_out.txt
10,Administration,handball
20,Marketing,football
30,Purchasing,tennis

SQL>

似乎没关系,有点;现在,这只是一个简单的例子。如果您阅读UTL_FILE文档并进一步探索其功能,那就没关系了。