0

SQLクエリからのデータがないかどうかを確認したいのですが、ファイルを作成しないでください。

これが私のコードです:

CREATE OR REPLACE PROCEDURE VR_AD_INTEGRATION_EXPORT AS
    l_v_file UTL_FILE.file_type
BEGIN
 l_v_file := UTL_FILE.fopen('integration', 'HRMtoAD1_'||to_char(sysdate,'YYYYMMDD')||'_'||to_char(sysdate,'HH24MISS'), 'w', 32767);
FOR x IN (SELECT * FROM (SELECT 
           decode(pid, NULL, RPAD(' ',7,' '), RPAD(user_id, 7, ' '))|| '' ||
           decode(name_last, NULL, RPAD(' ',50,' '), RPAD(name_last, 50, ' '))
           str FROM vr_ad_integration WHERE integrated = 'N') str WHERE rownum <= 1000 ORDER BY rownum)
LOOP
    BEGIN
        UTL_FILE.put_line(l_v_file, x.str);
    END;
END LOOP;
UTL_FILE.fflush(l_v_file);
UTL_FILE.fclose(l_v_file);
END VR_AD_INTEGRATION_EXPORT;

これで、リモートの場所にファイルを正常に作成できます。ただし、select クエリにデータがない場合はどうなるでしょうか。ファイルは作成されません。私が正しければ、例外コードを含める必要がありますが、この場合の方法がわかりません。なにか提案を?

乾杯!:-)

4

2 に答える 2

1

これを実現するにはいくつかの方法があります。1 つは、明示的なカーソルを使用してより手続き的なアプローチを採用し、レコードがフェッチされた後にのみファイルを開くことです。2 つ目は、コードを変更してループ内にカウントを含め、カウントがゼロの場合はファイルを削除することです。

これは、前のオプションの変形である 3 番目の選択肢です。ファイルのサイズをテストし、ゼロの場合は UTL_FILE.FREMOVE() コマンドを使用して削除します。後で参照できるように、生成されたファイル名を変数に格納する必要があることに注意してください。

CREATE OR REPLACE PROCEDURE VR_AD_INTEGRATION_EXPORT AS
     l_v_file UTL_FILE.file_type;
     l_filename varchar2(128);  
     f_exists boolean;
     f_size pls_integer;
     f_blk_size pls_integer;
BEGIN  
    l_filename := 'HRMtoAD1_'||to_char(sysdate,'YYYYMMDD')||'_'||to_char(sysdate,'HH24MISS');
    l_v_file := UTL_FILE.fopen('integration',  l_filename , 'w', 32767); 
    FOR x IN (SELECT * FROM (SELECT
             decode(pid, NULL, RPAD(' ',7,' '), RPAD(user_id, 7, ' '))|| '' ||            decode(name_last, NULL, RPAD(' ',50,' '), RPAD(name_last, 50, ' '))
            str 
                 FROM vr_ad_integration 
                 WHERE integrated = 'N') str 
         WHERE rownum <= 1000 ORDER BY rownum) LOOP
     BEGIN
         UTL_FILE.put_line(l_v_file, x.str);
     END; 
    END LOOP; 
    utl_file.fgetattr('integration',  l_filename , f_exists, f_size, f_blk_size);
    if f_size > 0 then
        UTL_FILE.fflush(l_v_file); 
        UTL_FILE.fclose(l_v_file); 
    else
        UTL_FILE.fclose(l_v_file); 
        utl_file.fremove('integration',  l_filename);
    end if;
END VR_AD_INTEGRATION_EXPORT; 

UTL_FILE パッケージには、行の読み取りと書き込み以外にも便利な機能がいくつかあります。詳細については、ドキュメントを読むことをお勧めします

于 2012-07-30T08:02:48.663 に答える
0

フラグを使用してファイルが作成されているかどうかを確認し、ループの最初の実行時に一度だけ作成します。擬似コード:

bool fileCreatedFlag = false;
for x in (SELECT ...):
    if(!fileCreatedFlag):
        l_v_file = fopen(...);
        fileCreatedFlag = true;

    put_line(...);

if(fileCreatedFlag):
    fflush;
    fclose;
于 2012-07-30T07:48:08.950 に答える