【问题标题】:If no data then don't create empty file如果没有数据,则不要创建空文件
【发布时间】:2012-07-27 20:50:45
【问题描述】:

我想检查是否没有来自 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;

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

干杯! :-)

【问题讨论】:

    标签: oracle plsql oracle11g plsqldeveloper


    【解决方案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

    【讨论】:

    • 在您的脚本中进行了一些更改后,我能够使其工作
    • 您需要进行哪些更改?如果我的回答尽可能好,这将对未来的求职者有所帮助。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 2020-03-11
      • 2021-11-05
      • 2012-05-29
      • 2019-03-31
      • 1970-01-01
      • 2014-09-19
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多