暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

读取目录中的单个文件 -- 用于Oracle EBS应用程序中的UTL_FILE

askTom 2017-08-17
543

问题描述

我正在将此软件包注册为Oracle中的并发程序。

在目录 “DATA_NOT_RETAIL_INCOME” 中,我将只有一个文件,但我不知道该文件的全名。

在oracle中注册为并发程序时,由于文件名不固定,如何将参数传递给文件名。但是在目录中我们只有一个文件。

CREATE OR REPLACE PACKAGE BODY grm_detail(p_filename1  IN  VARCHAR2) IS

    v_file          UTL_FILE.FILE_TYPE;
    v_source        VARCHAR2(4);
    v_acc_date      VARCHAR2(10);
 v_account       VARCHAR2(40);
 v_transit       VARCHAR2(40);
 v_trans_type    VARCHAR2(40);
 v_amt_type      VARCHAR2(40);
 v_currency      VARCHAR2(40);
 v_amount        VARCHAR2(40);
 v_sign          VARCHAR2(40); 
 g_grm_batch_id  NUMBER;
    v_file_path     VARCHAR2(1000);
    v_datstring     VARCHAR2(32767) := NULL;
    v_file_date     VARCHAR2(10);
  
    v_invalid_file_exception       EXCEPTION;
 v_file_name  VARCHAR2(1000) := p_filename1;


  BEGIN

    SELECT xxbns_grm_batch_id_seq.NEXTVAL
      INTO g_grm_batch_id
      FROM dual;

    v_file := utl_file.fopen(location     => 'DATA_NOT_RETAIL_INCOME',
                             filename     => v_file_name,
                             open_mode    => 'r',
                             max_linesize => 32767);

    LOOP
      BEGIN

        utl_file.get_line(v_file, v_datstring);


  IF substr(v_datstring, 1, 4) = 'Test' THEN
          v_source     := substr(v_datstring, 1, 4);
          v_acc_date   := substr(v_datstring, 5, 6);
    v_account    := substr(v_datstring, 11, 7);
    v_transit    := substr(v_datstring, 18, 5);
    v_trans_type := substr(v_datstring, 23, 1);
    v_amt_type   := substr(v_datstring, 24, 1);
    v_currency   := substr(v_datstring, 25, 3);
    v_amount     := substr(v_datstring, 28, 27);
    v_sign       := substr(v_datstring, 55, 1);


        END IF;

          BEGIN
            INSERT INTO XXBNS_GRM_DATA_LOAD
                       (FILE_NAME,
                        BATCH_ID,
                        SOURCE,
                        ACCOUNTING_DATE,
                        ACCOUNT,
                        TRANSIT,
                        TRANS_TYPE,
                        AMT_TYPE,
                        CURRENCY,
                        AMOUNT,SIGN)
                 VALUES(v_file_name,
                        g_grm_batch_id,
                        v_source,
                        v_acc_date,
                        v_account,
                        v_transit,
                        v_trans_type,
                        v_amt_type,
                        v_currency,
                        v_amount,
                        v_sign);

            COMMIT;

    
         END;

         END LOOP;

        v_datstring := NULL;

     IF utl_file.is_open(v_file) THEN
           utl_file.fclose(v_file);
        END IF;

END grm_detail;

专家解答

我认为这与问题有关

https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:9536325800346804830

在这种情况下,改变

过程grm_detail (变量2中的p_filename1)



过程grm_detail (VARCHAR2中的p_filename1默认为null)

然后添加一些处理,如果未传递,则可以确定文件名,即,

if p_filename1 is null then
  select file_name
  in到  v_filenae
  from   external_table_that_does_a_dir_listing
  where  rownum = 1;
else
  v_filename := p_filename1;
end if;

v_file := utl_file.fopen(location     => 'DATA_NOT_RETAIL_INCOME',
                             filename     => v_filename,
                             open_mode    => 'r',
                             max_linesize => 32767);



That way your routine will pick up the right filename by default, but if you ever want 到explicitly process a known file you can also do it.
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论