我想使用oracle将数百万条记录插入到一个文件中,而不使用循环或java代码。
浏览时我在oracle中发现了一些util_file,用于将行记录到文件中但无法使用它。有些人可以帮助我理解或编写代码,将select查询返回的结果集写入文件,甚至程序都可以工作。我尝试了下面的程序,它运行成功,但不创建带数据的文件
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;
答案 0 :(得分:1)
1)如果你在unix中使用sqlplus ..这是一个简单的解决方案,将下面作为script_name.ksh并执行它(ksh script_name.ksh)
sqlplus -s user_id/password@sid << ! >> ~/sql_output.txt
set feedback off;
set pages 0;
set linesize 20000;
set arraysize 1000;
set tab off;
--Your Query, with proper padding , or comma seprated
--Eg Select employee_id||'|'||employee_name||'|'||employee_age
-- from employee;
!
2)如果您使用的是SQL Developer
或TOAD
等IDE,则可以执行查询并将其导出。
3)但是对于PL / SQL
下面提到的test_dir 是主机中的一个目录,可供Oracle访问。它应该列在* ALL_DIRECTORIES *字典表中。
DECLARE
fileHandler UTL_FILE.FILE_TYPE;
cursor emp_cursor is select employee_id,employee_name,employee_age FROM employee;
TYPE emp_type IS TABLE OF emp_cursor%ROWTYPE INDEX BY PLS_INTEGER;
l_emp_type emp_type;
v_fetch_limit NUMbER := 10000;
BEGIN
fileHandler := UTL_FILE.FOPEN('test_dir', 'sql_output.txt', 'W',max_linesize => 4000);
open emp_cursor;
LOOP
FETCH emp_cursor BULK COLLECT INTO l_emp_type LIMIT v_fetch_limit;
EXIT WHEN l_emp_type.COUNT < v_fetch_limit;
// Used to control the fetch size.
FOR I IN 1..l_emp_type.COUNT LOOP
UTL_FILE.PUTF(fileHandler, '%s|%s|%s',l_emp_type(I).employee_id,
l_emp_type(I).employee_name,
l_emp_type(I).employee_age);
END LOOP;
UTL_FILE.FFLUSH(fileHandler);//Flush the buffer to file
END LOOP
UTL_FILE.FCLOSE(fileHandler);
IF(emp_cursor%ISOPEN) THEN
emp_cursor.close();
END IF;
EXCEPTION
WHEN utl_file.invalid_path THEN
raise_application_error(-20000, 'ERROR: Invalid PATH FOR file.');
IF(emp_cursor%ISOPEN) THEN
emp_cursor.close();
END IF;
END;
/
最后,从Server的UTL_FILE目录中复制它。 该目录也可以是NAS安装。只是Oracle需要具有写访问权。
4)像PL / SQL,Pro * C程序或任何OCI接口一样也可以工作!通常,选项3和4可以让您在进程中获得良好的控制权!
祝你好运!
编辑:增加了对抓取大小和刷新的改进