在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
.
.
.
答案 0 :(得分:0)
UTL_FILE
是此类任务的不错选择。
还有另一个选项EXTERNAL TABLE
,但您无法使用它写入CSV文件。
确保您拥有CREATE DIRECTORY
权限,这是这两个选项最重要的第一步。
请参阅此链接以获取更多详细信息:
答案 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文档并进一步探索其功能,那就没关系了。