将 Oracle 过程移植到 PostgreSQL(来自 orafce 的 utl_file 模块的异常代码)
Porting Oracle procedure to PostgreSQL (exception codes from orafce for utl_file module)
我正在将数据库从 Oracle 迁移到 PostgreSQL。我们正在使用 ora2pg to make the conversion the plus automatic possible and the orafce PostgreSQL 插件以实现功能兼容性。
我们才刚刚开始,还有很多工作要做。
刚才我在处理存储过程(ora2pg 脚本的输出),在解决了不同的语法错误后,我不知道如何解决最后一个错误。
特别是有问题的代码如下:
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;
产生的错误如下
ERROR: syntax error at or near "UTL_FILE"
LINE 341: RAISE EXCEPTION '%', 'File location or filename was inval...
^
********** Error **********
如果我只使用异常处理的 "when others" 部分它工作正常,所以问题来自常量 UTL_FILE.INVALID_PATH 和 UTL_FILE.INVALID_MODE 无法被 PostgreSQL 识别。
知道如何处理 utl_file 模块的 orafce 异常代码吗?
PLpgSQL 不允许定义自己的异常 - 所以 Orafce 不能定义 UTL_FILE.*
异常。您应该查看 orafce source code file.c 使用的异常列表:
代码使用宏CUSTOM_EXCEPTION
#define CUSTOM_EXCEPTION(msg, detail) \
ereport(ERROR, \
(errcode(ERRCODE_RAISE_EXCEPTION), \
errmsg("%s", msg), \
errdetail("%s", detail)))
在此 list 中您可以看到所有 PostgreSQL 异常。所以使用的异常的名称是 raise_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;
我正在将数据库从 Oracle 迁移到 PostgreSQL。我们正在使用 ora2pg to make the conversion the plus automatic possible and the orafce PostgreSQL 插件以实现功能兼容性。
我们才刚刚开始,还有很多工作要做。
刚才我在处理存储过程(ora2pg 脚本的输出),在解决了不同的语法错误后,我不知道如何解决最后一个错误。
特别是有问题的代码如下:
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;
产生的错误如下
ERROR: syntax error at or near "UTL_FILE"
LINE 341: RAISE EXCEPTION '%', 'File location or filename was inval...
^
********** Error **********
如果我只使用异常处理的 "when others" 部分它工作正常,所以问题来自常量 UTL_FILE.INVALID_PATH 和 UTL_FILE.INVALID_MODE 无法被 PostgreSQL 识别。
知道如何处理 utl_file 模块的 orafce 异常代码吗?
PLpgSQL 不允许定义自己的异常 - 所以 Orafce 不能定义 UTL_FILE.*
异常。您应该查看 orafce source code file.c 使用的异常列表:
代码使用宏CUSTOM_EXCEPTION
#define CUSTOM_EXCEPTION(msg, detail) \
ereport(ERROR, \
(errcode(ERRCODE_RAISE_EXCEPTION), \
errmsg("%s", msg), \
errdetail("%s", detail)))
在此 list 中您可以看到所有 PostgreSQL 异常。所以使用的异常的名称是 raise_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;