将数百万条记录插入文件中

时间:2013-12-23 16:19:23

标签: oracle stored-procedures procedure

我想使用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;

1 个答案:

答案 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 DeveloperTOAD等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可以让您在进程中获得良好的控制权!

祝你好运!

编辑:增加了对抓取大小和刷新的改进