gpt4 book ai didi

sql - PL/SQL 验证/插入/更新状态 - retval 与异常

转载 作者:行者123 更新时间:2023-12-04 18:26:02 26 4
gpt4 key购买 nike

我一直在寻求改进和应用最佳实践。在过去的几周里,我读了很多关于重构的文章。我不得不处理很多糟糕的代码,我也制作了一些不太好的东西,但我正在努力改变它。这对大多数语言来说都没有问题,但我对 PL/SQL 还很陌生,所以我只是复制了已经编写的代码的样式。

在阅读了一些教程之后,我意识到我们的很多代码更多的是使用 retval 而不是异常等的 C 风格代码。

我们有很多功能,比如打开游标、遍历它、验证数据、修剪它或进行一些字符串操作并将其插入另一个表、更新状态等。我想知道最佳实践解决方案是什么样的在这样的事情上。 Atm 的大部分功能如下所示:

LOOP
FETCH C_ABC INTO R_ABC;
EXIT WHEN C_ABC%NOTFOUND OR C_ABC%NOTFOUND IS NULL;
SAVEPOINT SAVE_LOOP;

retval := plausibilty_check(r_ABC);

IF (retval = STATUS_OK) THEN
retval := convert_ABC_TO_XYZ(r_ABC, r_XYZ);
END IF;

IF (retval = STATUS_OK) THEN
retval := insert_XYZ(r_XYZ);
END IF;

retval := update_ABC(r_ABC.PK_Id, retval);

END LOOP;

如果我使用异常,我想我必须在函数内部引发它们,这样我才能在主函数中处理它们,否则每个人都必须爬行到每个子函数以了解程序和更新发生的位置等。所以我想我必须在循环中使用另一个 PL/SQL block ?喜欢:

LOOP
FETCH C_ABC INTO R_ABC;
EXIT WHEN C_ABC%NOTFOUND OR C_ABC%NOTFOUND IS NULL;
SAVEPOINT SAVE_LOOP;

BEGIN
plausibilty_check(r_ABC);
convert_ABC_TO_XYZ(r_ABC, r_XYZ);
insert_XYZ(r_XYZ);
update_ABC(r_ABC.PK_Id, STATUS_OK);
EXCEPTION
WHEN ERROR_CODE_XYZ THEN
update_ABC(r_ABC.PK_Id, ERROR_CODE_XYZ);
END
END LOOP;

我想这个函数处理的是一个很常见的问题,但我仍然没有找到任何涵盖此类内容的教程。也许对 PL/SQL 更有经验的人可能会提示类似任务的最佳实践是什么样的。

最佳答案

如果发生异常事件(例如错误),我喜欢使用异常跳出代码块。

检测错误条件的“retval”方法的问题在于,它引入了关于函数是什么和用途的第二层语义。

原则上应该使用函数来进行计算并返回结果;从这个意义上说,函数不会任何事情,即它不会对任何状态进行任何更改 - 它只会返回一个值。

如果由于某种原因它不能计算那个值,那将是一个异常(exception)情况,所以我希望函数引发一个异常,这样调用程序就不会盲目地继续它的快乐方式,认为它得到了一个有效的来自函数的值。

另一方面,过程是一种完成操作的方法 - 更改某些内容、验证某些内容或发送某些内容。正常的预期路径是过程被执行,它做它的事情,然后它结束。如果发生错误,我希望它引发异常,这样调用程序就不会盲目地继续认为该过程已成功完成它的工作。

因此,保留了“过程”和“函数”之间根本区别的初衷。

在像 C 这样的语言中,没有过程——从某种意义上说,一切都是函数(即使是返回“void”的函数)——但除此之外,没有真正的“异常”概念"- 所以这些语义不适用。正是出于这个原因,返回错误/成功标志的 C 风格不能很好地翻译成 PL/SQL 等语言。

在你的例子中,我会考虑这样做:

BEGIN
LOOP
FETCH c_ABC INTO r_ABC;
EXIT WHEN c_ABC%NOTFOUND;

IF record_is_plausible(r_ABC) THEN

r_XYZ := convert_ABC_TO_XYZ(r_ABC);

insert_or_update_XYZ(r_XYZ);

ELSE

update_as_implausible(r_ABC);

END IF;

END LOOP;
EXCEPTION
WHEN OTHERS THEN
-- log the error or something, then:
RAISE;
END;

因此,在操作的语义是进行一些验证或其他操作并返回结果的地方,我将 plausibilty_check 转换为返回 bool 值的函数 record_is_plausible。

关于sql - PL/SQL 验证/插入/更新状态 - retval 与异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20595852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com