2012-07-30 57 views
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; 

现在我可以在远程位置成功创建文件。但是,如果选择查询中没有数据呢?不应该创建文件。如果我是正确的,我需要包含异常代码,但在这种情况下我不知道如何去做。任何建议?

干杯! :-)

回答

1

有几种方法可以实现这一点。一种是采用更明确的游标的程序方法,只有在记录被提取后才打开文件。第二种方法是修改代码以在循环中包含计数,并在计数为零时删除文件。

这是第三个选项,它是上一个选项的变体。它测试文件的大小,如果它是零,则使用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包中还有一些有用的功能。我建议你阅读文档到find out more

+0

经过您的脚本的一些变化,我能够使其工作 – Jaanna 2012-07-30 10:26:59

+0

你需要做什么改变?如果我的回答尽可能好,这对未来的求职者会有所帮助。 – APC 2012-07-30 11:30:08

0

使用标志来检查文件是否被创建,并且只在通过循环的第一次运行时创建一次。伪代码:

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

    put_line(...); 

if(fileCreatedFlag): 
    fflush; 
    fclose; 
+0

谢谢..良好的了解其他方式:-) – Jaanna 2012-07-30 10:27:18

相关问题