Postgresql pl/pgsql中的UTL_文件
有人能给我解释一下如何在PostgreSQL pl/pgsql中使用UTL_文件包吗。每次我进行查询时都会出现此错误 表utl_文件“”的子句条目中缺少: 这是我的代码:Postgresql pl/pgsql中的UTL_文件,postgresql,plpgsql,orafce,Postgresql,Plpgsql,Orafce,有人能给我解释一下如何在PostgreSQL pl/pgsql中使用UTL_文件包吗。每次我进行查询时都会出现此错误 表utl_文件“”的子句条目中缺少: 这是我的代码: CREATE OR REPLACE FUNCTION xxxxxx( IN strficname text, IN lnguser bigint, IN lngproduct bigint, IN lnginsurer bigint, IN lngregion bigint, O
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;
似乎表明正确的调用约定是utl_file.fclose_all:
使你的文章尽可能简洁。看UTL_文件是Oracle软件包。。。Postgres根本没有软件包谢谢Gurvinder的评论。。。我无法使它更简洁,因为我真的不知道问题出在哪里,也不知道如何解决它。。对于postgres,你有orafce,它允许你有UTL_文件包,所以我用它来实现我的功能。我相信你应该标记orafce。整个问题是为了orafce,不是为了pgok,我已经试过了。。现在我遇到了这个错误:查询没有结果的目标data@Kamfasage对不起,我帮不了你更多。
exception
when others then
utl_file.fclose_all();
end;