首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Oracle过程移植到PostgreSQL ( utl_file模块的orafce异常代码)

将Oracle过程移植到PostgreSQL ( utl_file模块的orafce异常代码)
EN

Stack Overflow用户
提问于 2017-04-25 17:21:18
回答 1查看 618关注 0票数 0

我正处于从Oracle到PostgreSQL的数据库迁移过程中。我们使用ora2pg使转换成为可能的加法自动和奥拉菲插件的PostgreSQL功能兼容性。

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

刚才我使用的是存储过程(来自ora2pg脚本的输出),在解决了不同的语法错误之后,我不知道如何解决最后一个错误。

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

代码语言:javascript
复制
 select utl_file.put_line(vIdLog,'******************************** COMPTE RENDU PURGE_DOUBLONS_FS **************************');
 select utl_file.put_line(vIdLog,'*      - Debut du traitement le          : '||vDateDebut);
 select utl_file.put_line(vIdLog,'*');
 select utl_file.put_line(vIdLog,'*      - Nb de lun appairées à plusieurs ZV  : ' || vNbLunMultiZV);
 select utl_file.put_line(vIdLog,'*      - Nb FS appairée à plusieurs ZV       : ' || vNbUpdateFsMultiZV);
 select utl_file.put_line(vIdLog,'*      - Nb Liens Lun/FS en suppression logique    : ' || vNbUpdateLunMultiZV);
 select utl_file.put_line(vIdLog,'*      - Nb Liens FS en suppression logique    : ' || vNbUpdateFsMultiZV);
 select utl_file.put_line(vIdLog,'*      - Nb Liens FS(ZG mono ZV)en suppression logique    : ' || vNbUpdateLunFSZVseule);
 select utl_file.put_line(vIdLog,'*      - Nb Liens FS(ZG mono ZV)en suppression logique 2  : ' || vNbUpdateLunFSZVseule2);
 select utl_file.put_line(vIdLog,'*      - Nb Liens LUN/FS ZV obsolètes             : ' || vNbOldLunZV);
 select utl_file.put_line(vIdLog,'*      - Nb Liens LUN/FS ZG obsolètes             : ' || vNbOldLunZG);
 select utl_file.put_line(vIdLog,'*      - Temps de traitement de calcul   : ' || OUTILS.time_to_char(tTotal));
 select utl_file.put_line(vIdLog,'*');
 select utl_file.put_line(vIdLog,'*      - Fin du calcul HOST_LUN le       : ' || to_char(clock_timestamp(), 'DD/MM/YYYY HH24:MI:SS'));
 select utl_file.put_line(vIdLog,'************************** FIN COMPTE RENDU PURGE_DOUBLONS_FS ****************************');
 select utl_file.fclose(vIdLog);
EXCEPTION
 when UTL_FILE.INVALID_PATH then
   select Fin_traitement_fichier('Erreur E/S');
   RAISE EXCEPTION '%', 'File location or filename was invalid.';
 when UTL_FILE.INVALID_MODE then
   select Fin_traitement_fichier('Erreur E/S');
   RAISE EXCEPTION '%', 'The open_mode parameter in FOPEN was invalid.';
 when others then
   select Fin_traitement_fichier(SQLERRM);
   RAISE NOTICE 'ERR005 : ERREUR TRAITEMENT PURGE_DOUBLONS_FS : %', SQLERRM;
   IF cFs%ISOPEN THEN
     CLOSE cFs;
   END IF;

产生的错误如下

代码语言:javascript
复制
ERROR:  syntax error at or near "UTL_FILE"
LINE 341:    RAISE EXCEPTION '%', 'File location or filename was inval...
                     ^
********** Error **********

如果我只使用异常处理中的"when others“部分,它就能正常工作,所以问题来自于UTL_FILE.INVALID_PATHUTL_FILE.INVALID_MODE这两个常量,它们没有被PostgreSQL识别。

是否知道如何处理utl_file模块的异常代码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-26 04:34:47

PLpgSQL不允许定义自己的异常,因此Orafce不能定义UTL_FILE.*异常。您应该查找orafce 源代码 file.c来列出已使用的异常:

代码使用宏CUSTOM_EXCEPTION

代码语言:javascript
复制
#define CUSTOM_EXCEPTION(msg, detail) \
    ereport(ERROR, \
        (errcode(ERRCODE_RAISE_EXCEPTION), \
         errmsg("%s", msg), \
         errdetail("%s", detail)))

在这个列表中,您可以看到所有PostgreSQL异常。因此,使用的异常名为raise_exception,异常的原因是在SQLERRM变量中。因此,您的代码应该看起来像:

代码语言:javascript
复制
WHEN RAISE_EXCEPTION THEN
  CASE SQLERRM
   WHEN 'UTL_FILE_INVALID_PATH' THEN
     PERFORM ...
   WHEN 'UTL_FILE_INVALID_MODE' THEN
     PERFORM ...
   ELSE 
     PERFORM ...
   END;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43617176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档