2016-07-01 60 views
1

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を使用することはできませんので、whchのDBサーバーではありません。 UTL_FILE以外の方法でファイルに書き込むことはできますか?

+0

どのようにDBサーバーにできないのですか?どこでそれをしようとしていますか?あなたはおそらくOracleフォームを使用していますか? – pablomatico

+0

アプリケーションサーバー –

+0

と、このpl/sqlプロシージャをどこで実行していますか? oracleフォームを使用している場合は、 'TEXT_IO'パッケージ – pablomatico

答えて

0

かわりに、SQLPLUSを使用しないのはなぜ...

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

+0

外部表は、データをoracle dbに入れます。 oracle dbの場所にファイルを生成したい –

+0

バージョン10g +の場合は、外部表を使用してoracle dbからスプールまたはurl_fileを避けてデータを生成することができます。 http://www.oracle-developer.net/display.php?id=325を見てください。 – jackattack

0

を外部表を作成することができますか?いくつかのSETコマンドで、あなたのSQLを含む単純な.sqlファイル(my_script.sql)を作成し、のようなもの:必要に応じて

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ファイルは、SQLPLUSを使用して、そのディレクトリからOracleにログインすることを置き、実行します。

my_script.sql

@出力ファイル(my_file.csvが)になりますあなたがログインしたディレクトリ。 sqlplusログインスクリプトを使用して、(cronまたはタスクスケジューラまたは他のスケジューリングソフトウェアと同様に)物事を自動化することもできます。

+0

この場合、動的な –

+0

でなければなりません。あなたが選んだ言語(java、C#、あなたが知っている環境であれば何でも)でプログラムを書いてデータを取り出すべきです。あなたが言語の基本を知っていれば、それは困難な仕事ではありません(そしてたくさんの例があります)。既存のCSVライブラリを使用し、独自のCSVライブラリを使用しないでください。 – tbone

関連する問題