Как записать в файл кроме UTL_FILE

Я написал программу для записи файла в каталог, используя utl_file.

пример скрипта:

PROCEDURE XX_FILE_TRANS (X_RETCODE VARCHAR2,X_ERRBUF VARCHAR2)
IS

CURSOR ORG_CUR IS
SELECT
'"'||XTRO.IDENTIFIER||'","'||
XTRO.ORGANIZATION_CODE||'","'||
XTRO.NAME ||'","'||
XTRO.PARENT_CODE ||'","'||
XTRO.INDUSTARY_NUMBER ||'","'||
XTRO.STATUS||'","'||
XTRO.SEQUENCE||'"' "ORG_DATA"
FROM abc XTRO;


ORG_REC ORG_CUR%rowtype;

begin
begin
         delete XXHCM.XXHR_TAL_REC_ORGANIZATION_hist
    where     1 = 1
          AND creation_date < TRUNC (SYSDATE - 60);

         COMMIT;
      EXCEPTION
         when OTHERS
         then
            null;
      end;


LOAD_archive_TABLE; -- call the history table procedure
DBMS_OUTPUT.PUT_LINE('start');
  fileHandler := UTL_FILE.FOPEN('INTF_DIR_INBOUND', LC_OLF_ORG, 'W');
  UTL_FILE.put_line(fileHandler, 'Identifier,OrgCode,OrgName,ParentCode,IndustryNumber,StatusDescription,Sequence');


  FOR ORG_REC IN ORG_CUR
  LOOP
             UTL_FILE.put_line(fileHandler,ORG_REC.ORG_DATA);
  END LOOP;

  UTL_FILE.FCLOSE(fileHandler);
dbms_output.put_line('end');
EXCEPTION
 WHEN UTL_FILE.INVALID_PATH THEN
           FND_FILE.PUT_LINE(FND_FILE.LOG,'    Invalid File Path');
            UTL_FILE.FCLOSE(fileHandler);
            dbms_output.put_line('1'||sqlerrm);
         WHEN UTL_FILE.WRITE_ERROR THEN
           FND_FILE.PUT_LINE(FND_FILE.LOG,'    Write Permission on  does not exist');
            UTL_FILE.FCLOSE(fileHandler);
            dbms_output.put_line('2'||sqlerrm);
         WHEN UTL_FILE.INVALID_MODE THEN
            FND_FILE.PUT(FND_FILE.LOG,'THE INVALID MODE OF DATA FILE');
            UTL_FILE.FCLOSE(fileHandler);
            dbms_output.put_line('3'||sqlerrm);
         WHEN UTL_FILE.INVALID_OPERATION THEN
            FND_FILE.PUT(FND_FILE.LOG,' THE FILE CANNOT BE OPENED AS REQUESTED.');
            UTL_FILE.FCLOSE(fileHandler);
            dbms_output.put_line('4'||sqlerrm);
         WHEN UTL_FILE.INVALID_MAXLINESIZE THEN
            FND_FILE.PUT(FND_FILE.LOG,'THE SPECIFIED MAXIMUM LINE SIZE IS TOO LARGE OR TOO SMALL.');
            UTL_FILE.FCLOSE(fileHandler);
            dbms_output.put_line('5'||sqlerrm);
         WHEN UTL_FILE.ACCESS_DENIED THEN
            FND_FILE.PUT(FND_FILE.LOG,'ACCESS TO THE DIRECTORY OBJECT IS DENIED.');
            FND_FILE.PUT(FND_FILE.LOG,'OPERATING SYSTEM ERROR OCCURED DURING THE WRITE OPERATION.');
            UTL_FILE.FCLOSE(fileHandler);
            dbms_output.put_line('6'||sqlerrm);
         WHEN UTL_FILE.CHARSETMISMATCH  THEN
            FND_FILE.PUT(FND_FILE.OUTPUT,'THIS FILE IS OPEN FOR NCHAR DATA.');
            UTL_FILE.FCLOSE(fileHandler);
            dbms_output.put_line('7'||sqlerrm);
END;

Теперь мой сервер не является сервером БД, из-за чего я не могу использовать UTL_FILE. Есть ли другой способ записи в файл, кроме UTL_FILE?


person sreekem bose    schedule 01.07.2016    source источник
comment
Как это не может быть сервер БД? Где вы пытаетесь это сделать? Возможно, вы используете формы оракула?   -  person pablomatico    schedule 01.07.2016
comment
и где вы выполняете эту процедуру pl/sql? если вы используете формы оракула, вы можете использовать пакет TEXT_IO   -  person pablomatico    schedule 04.07.2016
comment
Нет... это пакет pl/sql. В основном я создам параллельную программу, которая будет генерировать файл из сценической таблицы.   -  person sreekem bose    schedule 04.07.2016
comment
Я не понимаю, почему вы не можете использовать utl_file.   -  person pablomatico    schedule 04.07.2016
comment
UTL_FILE — наиболее распространенный способ сделать это. Если вам нужна альтернатива, было бы полезно объяснить, почему вам нужна альтернатива. Например, UTIL_FILE просто недоступен, потому что какой-то сценарий защиты базы данных отозвал его из PUBLIC? Если это так, вы можете попросить администратора баз данных предоставить его вашему пользователю или роли.   -  person Jon Heller    schedule 05.07.2016


Ответы (2)


Вместо этого вы можете создать ВНЕШНЮЮ ТАБЛИЦУ...

https://docs.oracle.com/cd/B19306_01/server.102/b14215/et_concepts.htm

person abrittaf    schedule 01.07.2016
comment
Внешняя таблица помещает данные в базу данных Oracle. Я хочу создать файл в месте из базы данных оракула - person sreekem bose; 02.07.2016
comment
Если вы используете версию 10g+, вы можете использовать эту технику, используя внешние таблицы, чтобы генерировать данные из oracle db, избегая буферизации или url_file. Взгляните на этот oracle-developer.net/display.php?id=325. . - person abrittaf; 02.07.2016
comment
AFAIK, вы не можете писать текст во внешние файлы? - person wolφi; 05.07.2018
comment
Так как 10g et rw - person abrittaf; 05.07.2018

Почему бы не использовать sqlplus? Создайте простой файл .sql (my_script.sql), содержащий ваш SQL, с несколькими командами SET, например:

SET FEEDBACK OFF;
SET ECHO OFF;
SET TERM OFF;
SET serveroutput on size unlimited;
SET linesize 30000
SET pagesize 0
SET head off
SET trims on
SET verify off

WHENEVER SQLERROR EXIT SQL.SQLCODE
SPOOL my_file.csv;

select 
'MY_NUMBER_FIELD1,'||
'MY_VARCHAR_FIELD2,'||
'MY_VARCHAR_FIELD3'
from dual
UNION ALL
select
COL1||','||
'"'||replace(COL2, '"','""')||'",'||
'"'||replace(COL3, '"','""')||'"'
from MY_TABLE
/

Измените SQL по мере необходимости. Поместите этот файл sql в каталог на сервере по вашему выбору, войдите в Oracle из этого каталога с помощью sqlplus и запустите:

@my_script.sql

Выходной файл (my_file.csv) будет находиться в каталоге, из которого вы вошли в систему. Сценарий входа в систему sqlplus также можно использовать для автоматизации (наряду с cron, планировщиком задач или другим программным обеспечением для планирования).

person tbone    schedule 01.07.2016
comment
Он должен быть динамичным - person sreekem bose; 04.07.2016
comment
в этом случае вы должны написать программу на выбранном вами языке (java, C#, все, что вы знаете и работаете в вашей среде) и извлечь данные. Если вы знаете основы языка, это несложная задача (и примеров много). Используйте существующую библиотеку CSV, не сворачивайте свою собственную. - person tbone; 04.07.2016