2013-12-23 3 views
0

Я хочу вставить миллионы записей в файл с использованием oracle и без использования кода цикла или java.Вставка миллиона записей в файл

во время просмотра Я нашел что-то как util_file в oracle, который используется для записи строк в файл, но не смог его использовать. может кто-то, пожалуйста, помогите мне в понимании или написании кода для записи набора результатов, возвращаемого выборочным запросом в файл, или даже процедура будет работать.

Я попытался ниже процедуру он успешно работать, но оленья кожа создать файл с данными

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

Я не хочу писать цикл, потому что запрос select будет возвращать более 10 миллионов записей, и я хочу сделать процесс быстрым, если я напишу цикл, тогда вам придется повторять все 10 миллионов + записи по одному и вставлять в файл, и это я первый раз работаю с процедурами, поэтому я не уверен, как они работают извините, но, по моему пониманию, я думал, что производительность процедур будет быстрой по сравнению с циклом sql, чтобы записать его в файл, пожалуйста, исправьте меня, если я ошибаюсь – user3124277

+3

Почему вы не смогли использовать 'utl_file'? Если у вас есть определенная проблема с кодом, который вы написали, используя это, добавьте свой код и ошибки в вопрос. Как и где вы будете ссылаться на этот процесс? Будет ли файл находиться на сервере или на клиенте? В каком формате будут находиться данные? –

ответ

0

1) если вы используете SQLPlus в UNIX .. Вот простое решение, поставить ниже как script_name.ksh и выполнить он (КШ script_name.ksh)

sqlplus -s user_id/[email protected] << ! >> ~/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) Если вы используете IDE как SQL Developer или TOAD, вы можете выполнить запрос и экспортировать его.

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; 
/

Наконец, скопируйте его из каталога UTL_FILE на сервере. Этот каталог может быть также монтирован на NAS. Просто Oracle должен иметь доступ на запись к нему.

4) Как и PL/SQL, программа Pro * C или любой интерфейс OCI тоже будут работать! Как правило, варианты 3 и 4 дают вам хороший контроль в процессе, который вы делаете!

Удачи!

EDIT: Добавлены улучшения по сравнению с размером выборки и промывки

+0

Я получаю недопустимый путь для файла ORA-06512 ошибка – user3124277

+0

вы можете сделать 'select * from all_directories;' –

+0

вместо 'test_dir', вы должны использовать это имя –

Смежные вопросы