【发布时间】:2013-12-23 16:19:23
【问题描述】:
我想使用 oracle 将数百万条记录插入文件中,而不使用循环或 java 代码。
在浏览时,我在 oracle 中发现了一些 util_file,它用于将行记录到文件中,但无法使用它。可以请一些人帮助我理解或编写代码以将选择查询返回的结果集写入文件,甚至程序甚至可以工作。
我尝试了以下程序,它成功运行但没有创建包含数据的文件
create or replace procedure familydetails
( p_file_dir IN varchar2, p_filename IN varchar2 )
IS v_filehandle utl_file.file_type;
cursor family Is
select * from fmly_detl
begin
v_filehandle :=utl_file.fopen('C:\tempfolder','sqltest.txt','W');
utl_file.new_line(v_filehandle);
for fmly IN fmly_detl LOOP
utl_file.putf(v_filehandle,'family %s details:s\n',fmly.last_name,fmly.first_name,fmly.indv_id);
end loop;
utl_file.put_line(v_filehandle,'END OF REPORT');
UTL_FILE.fclose(v_filehandle);
end familydetails;
【问题讨论】:
-
您有什么可能的理由来禁止使用循环?如果要写入文件,则需要过程代码。程序代码使用循环。
-
我不想写一个循环,因为选择查询会返回超过 1000 万条记录,如果我写一个循环,我想加快处理速度,然后必须一一重复所有超过 1000 万条记录并插入到文件中,这是我第一次使用程序,所以我不确定它们是如何工作的,抱歉,但据我所知,我认为与带有循环的 sql 将其写入文件相比,程序的性能会更快,如果我错了,请纠正我
-
您为什么无法使用
utl_file?如果您对使用该代码编写的代码有特定问题,请将您的代码和错误添加到问题中。您将如何以及在何处调用此过程?该文件将在服务器上还是在客户端上?数据将采用什么格式? -
@user3124277 - 将 1000 万行数据写入平面文件会相对较慢。如果您想在 PL/SQL 中执行此操作,您将需要一个遍历所有行的循环。您可以在循环中
BULK COLLECT数据(使用LIMIT)使事情变得更快,但我几乎可以保证上下文转换不会占您处理时间的很大一部分。 -
无论您使用的是 SQL、PL/SQL 还是 Java,数据都会从 DB 读取到缓冲区中;您可以调整数组大小来调整它。无论您是使用
utl_file还是Java 将数据写出,数据都将写入缓冲区中的磁盘。您似乎过早地进行了优化。如果你不理解你已经看过的utl_file的例子,如果有人在这里再试一次,你会明白吗?我们无法为您编写符合您规范的程序,您必须付出一些努力,否则您将无法理解或学习。
标签: oracle stored-procedures procedure