-3

有人可以向我解释如何将 UTL_FILE 包与 PostgreSQL (pl/pgsql) 一起使用。每次我做一个查询我都会有这个错误

缺少表“utl_file”`的 FROM 子句条目:

这是我的代码:

CREATE OR REPLACE FUNCTION xxxxxx(
    IN strficname text,
    IN lnguser bigint,
    IN lngproduct bigint,
    IN lnginsurer bigint,
    IN lngregion bigint,
    OUT intstat1 bigint,
    OUT intstat2 bigint,
    OUT intstat3 bigint,
    OUT intstat4 bigint,
    OUT intstat5 bigint,
    OUT intstat6 bigint,
    OUT intstat7 bigint,
    OUT intstat8 bigint,
    OUT intstat9 bigint,
    OUT strrejfilename text)
  RETURNS record AS
$BODY$
DECLARE


  strDirName      varchar(30)              := 'SGINSURANCE_DIR_SOURCE';
  strLogDirName   varchar(30)              := 'SG_DIR_ARCHIVE_LOG_INT';
  strRejDirName   varchar(30)              := 'SG_DIR_ARCHIVE_PROD_REJ';
  strProdDirName  varchar(30)              := 'SG_DIR_ARCHIVE_PROD_INT';
  oCopy           UTL_FILE.FILE_TYPE ;
  oFile           UTL_FILE.FILE_TYPE ;
  oLog            UTL_FILE.FILE_TYPE ;
  oReject         UTL_FILE.FILE_TYPE ;
  strLine           varchar(32767) ;
  strMsg          varchar(256) ;
  -- oExcept         Exception ;
  datIntegration  tbl_integration.int_integrationdate%type;
  lngRecord       bigint;
  strLogName      varchar(200);
  strRejectName   varchar(200);
  intResult       integer;
  lngReject       bigint;
  lngUpdate       bigint;
  lngInsert       bigint;
  datFile         timestamp;
  strProfile      varchar(200);

  lngSequence           bigint;


BEGIN

  delete from tbl_rejection where rej_user = lngUser and rej_integration is null;

  -- Init statistics
  intStat2 := 0;
  intStat3 := 0;
  intStat4 := 0;
  intStat5 := 0;
  intStat6 := 0;
  intStat7 := 0;
  intStat8 := 0;
  intStat9 := 0;

  -- Open file
  Begin
    oFile := UTL_FILE.FOPEN( strDirName, strFicName, 'R', 32764 ) ;
  Exception
    When OTHERS Then
      strMsg := SQLERRM || ' [' || strDirName || '] -> ' || strFicName;
      Raise  ;
  End ;
-- Calculate file date
  begin
    select to_date(f_convertdate_d2(substring(strFicName from 8 for 10)),'YYYYMMDD') into STRICT  datFile ;
   exception
    when others then
      datFile := date_trunc('day', LOCALTIMESTAMP);
  end;

  -- Creating log file
  Begin
    select substr(strFicName,1,length(strFicName)-4) || '_log_' || to_char(LOCALTIMESTAMP,'YYYYMMDDHH24MISS') || '.txt'  into strLogName ;
    oLog := UTL_FILE.FOPEN( strLogDirName, strLogName, 'W', 32764 ) ;
  Exception
    When OTHERS Then
      strMsg := SQLERRM || ' [' || strLogDirName || '] -> Log file';
      Raise  ;
  End ;

  -- Creating reject log file
  Begin
    select substr(strFicName,1,length(strFicName)-4) || '_blocked_records.txt'  into strRejectName ;
    oReject := UTL_FILE.FOPEN( strRejDirName, strRejectName, 'W', 32764 ) ;
  Exception
    When OTHERS Then
      strMsg := SQLERRM || ' [' || strRejDirName || '] -> Reject file';
      Raise  ;
  End ;
  strRejFileName := strRejectName;

  -- Creating copy file
  Begin
    oCopy := UTL_FILE.FOPEN( strProdDirName, strFicName, 'W', 32764 ) ;
  Exception
    When OTHERS Then
      strMsg := SQLERRM || ' [' || strProdDirName || '] -> Copy file';
      Raise  ;
  End ;

  -- Read file
  Begin
    -- init log file
    select utl_file.put_line ( oLog , 'Process file name : ' || strFicName ) ;
    select utl_file.put_line ( oLog , 'Process date : ' || to_char ( LOCALTIMESTAMP , 'YYYY-MM-DD HH24:MI:SS' ) ) ;
    begin
      select prf_label into strProfile
        from tbl_profile , tbl_user
        where prf_code = usr_profile
        and usr_id = lngUser;
    exception
      when others then
        strProfile := '';
    end;
    select utl_file.put_line ( oLog , 'User profile : ' || strProfile ) ;
    select utl_file.put_line ( oLog , '----------------------------------------------------' ) ;

    -- Test previous integration
    if POSITION('_BLOCKED_RECORDS' in upper(strFicName)) = 0 then
      begin
        select int_integrationdate into datIntegration
          from tbl_integration
          where int_filename = strFicName
          and int_filetype = 'RFB_CASCO';
        strMsg := 'File already integrated on ' || to_char(datintegration,'YYYY-MM-DD');
        intStat1 := 0;
        Raise  ;
      exception
        when NO_DATA_FOUND then
          null ;
      end;
    end if;

    intStat1 := 1;

    lngRecord := 0;
    lngReject := 0 ;
    lngUpdate := 0 ;
    lngInsert := 0 ;

    Loop
      select UTL_FILE.GET_LINE( oFile , strLine ) ;
      select utl_file.put_line ( oCopy , strLine ) ;
      select trim(strLine) into STRICT  strLine ;
      if POSITION(';|' in strLine) > 0 then
        strLine := substr(strLine,1,POSITION(';|' in strLine) - 1);
      end if;
      lngRecord := lngRecord + 1;
      if strLine is not null then
        intResult := 0;
        select xxxxxx ( strLine , lngRecord , strFicName , oLog , oReject , lngUser , lngProduct , lngInsurer , lngRegion , datFile , intResult );

        if intResult = 0 then
          lngReject := lngReject + 1 ;
        elsif intResult = 1 then
          lngUpdate := lngUpdate + 1 ;
        else
          lngInsert := lngInsert + 1 ;
        end if;
      end if;
    End loop ;

   Exception

     When NO_DATA_FOUND Then
        select UTL_FILE.FCLOSE( oFile ) ;
        select UTL_FILE.FCLOSE( oCopy ) ;

        select utl_file.put_line ( oLog , '----------------------------------------------------' ) ;
        select utl_file.put_line ( oLog , 'Number of total records processed : ' || lngRecord ) ;
        select utl_file.put_line ( oLog , 'Number of records rejected : ' || lngReject ) ;
        select utl_file.put_line ( oLog , 'Number of accounts updated : ' || lngUpdate ) ;
        select utl_file.put_line ( oLog , 'Number of accounts inserted : ' || lngInsert ) ;

        select UTL_FILE.FCLOSE( oLog ) ;
        select UTL_FILE.FCLOSE( oReject ) ;

        -- Save integration
        insert into tbl_integration ( int_filename , int_integrationdate , int_filetype , int_filedate) values ( strFicName , LOCALTIMESTAMP , 'RFB_CASCO' , datFile);

        select currval('seq_integration') into lngSequence ;

        update tbl_integration
          set int_productselected = 'RFB_CASCO'
          , int_registername = strFicName
          , int_numrecordregister = lngRecord
          , int_numrecordintegrated = lngInsert + lngUpdate
          , int_user = lngUser
          , int_login = (SELECT usr_login from tbl_user where usr_id = lngUser)
          where int_id = lngSequence;

        update tbl_rejection
          set rej_integration = lngSequence
          , rej_login = (SELECT usr_login from tbl_user where usr_id = lngUser)
          where rej_integration is null
          and rej_user = lngUser;

        commit;
  End;

  -- update tbl_contract set cnt_status='C' where cnt_status='I' and cnt_ClosingDate < sysdate and cnt_product not in (select prd_id from tbl_product where prd_name in ('BSGV_Quietis','BSGV_Quietis_Payroll','BSGV_Quietis_Premium','BSGV_Confidence'));

  commit;

  -- Creating process log file
  Begin
    oLog := UTL_FILE.FOPEN( strLogDirName, 'Integrations archive_log_' || to_char(LOCALTIMESTAMP,'YYYYMMDD') || '.txt', 'A', 32764 ) ;
  Exception
    When OTHERS Then
      strMsg := SQLERRM || ' [' || strLogDirName || '] -> Process log file';
      Raise  ;
  End ;

  -- Filling log file
  select utl_file.put_line ( oLog , 'Process file name: RFB_CASCO' );
  select utl_file.put_line ( oLog , 'Process date: ' || to_char(LOCALTIMESTAMP,'YYYY-MM-DD HH24:MI:SS') );
  begin
    select usr_login into strline from tbl_user where usr_id = lngUser;
  exception
    when others then
      strLine := '';
  end;
  select utl_file.put_line ( oLog , 'User id: ' || strLine );
  select utl_file.put_line ( oLog , 'Filename:  ' || strFicName );
  begin
    select par_value_txt into strLine from tbl_parameter where par_code = 1;
  exception
    when others then
      strLine := '';
  end;
  select utl_file.put_line ( oLog , 'Original directory: ' || strLine );
  begin
    select par_value_txt into strLine from tbl_parameter where par_code = 15;
  exception
    when others then
      strLine := '';
  end;
  select utl_file.put_line ( oLog , 'Final directory: ' || strLine );

  select utl_file.put_line ( oLog , '---' );
  begin
    select par_value_txt into strLine from tbl_parameter where par_code = 15;
  exception
    when others then
      strLine := '';
  end;
  select utl_file.put_line ( oLog , substr(strFicName,1,length(strFicName)-4) || ' source file is successfully auto archived into the parameterized ' || strLine || ' directory');

  begin
    select par_value_txt into strLine from tbl_parameter where par_code = 10;
  exception
    when others then
      strLine := '';
  end;
  select utl_file.put_line ( oLog , substr(strLogName,1,length(strLogName)-4) || ' log file is successfully auto archived into the parameterized ' || strLine || ' directory');

  begin
    select par_value_txt into strLine from tbl_parameter where par_code = 14;
  exception
    when others then
      strLine := '';
  end;
  select utl_file.put_line ( oLog , substr(strRejectName,1,length(strRejectName)-4) || ' rejection file is successfully auto archived into the parameterized ' || strLine || ' directory');
  select utl_file.put_line ( oLog , '---' );

  select utl_file.put_line ( oLog , 'Number of created files: 2');
  select utl_file.put_line ( oLog , 'Number of copied files: 1');
  select utl_file.put_line ( oLog , 'Number of moved files : 0');
  select utl_file.put_line ( oLog , '%-----------------------------------------------------------------------%' );
  select utl_file.put_line ( oLog , '%-----------------------------------------------------------------------%' );

  select utl_file.fclose ( oLog );

Exception
   When others Then
     select UTL_FILE.FCLOSE_ALL ;
     rollback ;
     RAISE;

End;
$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;
4

1 回答 1

0

文档似乎表明正确的调用约定是utl_file.fclose_all()

exception
  when others then
    utl_file.fclose_all();
end;
于 2016-12-22T04:45:05.867 回答