将Oracle过程移植到PostgreSQL(orafce for utl_文件模块的异常代码) 我正处于从Oracle迁移到PostgreSQL的数据库迁移过程中。我们正在使用它来实现plus的自动转换,并使用PostgreSQL插件实现函数兼容性

将Oracle过程移植到PostgreSQL(orafce for utl_文件模块的异常代码) 我正处于从Oracle迁移到PostgreSQL的数据库迁移过程中。我们正在使用它来实现plus的自动转换,并使用PostgreSQL插件实现函数兼容性,postgresql,plpgsql,orafce,Postgresql,Plpgsql,Orafce,我们刚刚开始,还有很多工作要做 刚才我正在处理存储过程(ora2pg脚本的输出),在解决了不同的语法错误之后,我不知道如何解决最后一个错误 特别是有问题的代码如下所示: 选择utl_文件。放入_行(vIdLog,************************************************************************************************************************************************

我们刚刚开始,还有很多工作要做

刚才我正在处理存储过程(ora2pg脚本的输出),在解决了不同的语法错误之后,我不知道如何解决最后一个错误

特别是有问题的代码如下所示:

选择utl_文件。放入_行(vIdLog,********************************************************************************************************************************************************************************************************”);
选择utl|U file.put|u行(vIdLog,'*-du traitement le:'| | vdatedefound);
选择utl_文件。放置_行(vIdLog,'*');
选择utl_file.put_行(vIdLog,'*-Nb de lun appairéesáplusieurs ZV:'| | vnzv);
选择utl|u file.put_行(vIdLog,'*-Nb FS appairéeáplusieurs ZV:'| | vNbUpdateFsMultiZV);
选择utl|u file.put_行(vIdLog,'*-Nb Liens Lun/FS en suppression logique:'| | vNbUpdateLunMultiZV);
选择utl|U file.put_行(vIdLog,'*-Nb Liens FS en suppression logique:'| | vNbUpdateFsMultiZV);
选择utl|U file.put|u line(vIdLog,'*-Nb Liens FS(ZG mono ZV)en suppression logique:'| | vNbUpdateLunFSZVseule);
选择utl|U file.put|u line(vIdLog,'*-Nb Liens FS(ZG mono ZV)en suppression logique 2:'| | vNbUpdateLunFSZVseule2);
选择utl_file.put_行(vIdLog,'*-Nb Liens LUN/FS ZV obsolètes:'| | vNbOldLunZV);
选择utl_file.put_行(vIdLog,'*-Nb Liens LUN/FS ZG obsolètes:'| | vNbOldLunZG);
选择utl|u file.put_line(vIdLog,'*-Temps de traitement de calcul:'| | OUTILS.time_to_char(tTotal));
选择utl_文件。放置_行(vIdLog,'*');
选择utl|U file.put_line(vIdLog,'*-Fin du calcul HOST_LUN le:'| | to_char(clock_timestamp(),'DD/MM/yyyyy HH24:MI:SS');
选择utl_文件。放置_行(vIdLog,******************************************FIN COMPTE RENDU PURGE_DOUBLONS_FS*****************************************”);
选择utl_file.fclose(vIdLog);
例外
当UTL_FILE.INVALID_路径
选择Fin_traitement_fichier(“错误”);
引发异常“%”,文件位置或文件名无效。“;
当UTL_FILE.INVALID_模式
选择Fin_traitement_fichier(“错误”);
引发异常“%”,FOPEN中的open_模式参数无效;
当其他人
选择Fin_traitement_fichier(SQLERRM);
提出通知'ERR005:ERREUR TRAITEMENT PURGE\u DOUBLONS\u FS:%',SQLERRM;
如果cFs%ISOPEN,则
关闭cFs;
如果结束;
产生的错误如下

ERROR:  syntax error at or near "UTL_FILE"
LINE 341:    RAISE EXCEPTION '%', 'File location or filename was inval...
                     ^
********** Error **********
如果我只使用异常处理的“when others”部分,它可以正常工作,因此问题来自常量UTL\u文件。无效路径UTL\u文件。PostgreSQL无法识别的无效模式


知道如何处理orafce for utl_文件模块的异常代码吗?

PLpgSQL不允许定义自己的异常-因此orafce无法定义
utl_文件。*
异常。您应该查看orafce以查看已使用的异常列表:

代码使用宏
自定义\u异常

#define CUSTOM_EXCEPTION(msg, detail) \
    ereport(ERROR, \
        (errcode(ERRCODE_RAISE_EXCEPTION), \
         errmsg("%s", msg), \
         errdetail("%s", detail)))
在这里,您可以看到所有PostgreSQL异常。因此,使用的异常的名称是
raise\u exception
,异常的原因是
SQLERRM
变量。因此,您的代码应该如下所示:

WHEN RAISE_EXCEPTION THEN
  CASE SQLERRM
   WHEN 'UTL_FILE_INVALID_PATH' THEN
     PERFORM ...
   WHEN 'UTL_FILE_INVALID_MODE' THEN
     PERFORM ...
   ELSE 
     PERFORM ...
   END;

选择Fin_traitement_fichier(“错误”);无效-您应该使用
执行
,而不是
选择
。处理完全相同情况的pgIm不支持语法
cFs%ISOPEN
。如何分配这些自定义异常?当我在SQLERRM中使用case时,我在case上有一个语法错误。你能给我解释一下你到底做了什么吗?我在处理同样的情况。如何分配这些自定义异常?当我在SQLERRM中使用case时,我在case上有一个语法错误。你能解释一下你到底做了什么吗?@Mariel-我不太明白你的问题。PLpgSQL有构建异常列表,可以通过长名称(字符串)指定。任何其他异常都应由SQLSTATE指定-