- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在寻求改进和应用最佳实践。在过去的几周里,我读了很多关于重构的文章。我不得不处理很多糟糕的代码,我也制作了一些不太好的东西,但我正在努力改变它。这对大多数语言来说都没有问题,但我对 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/
假设我有这段代码 def retval # some resource intensive computation return whatever end def foo ... re
我很难理解以下代码为何具有2种不同的行为: pub fn get(&self, idx: usize) -> &T { let arr = unsafe { core::slice::from
我正在尝试为 start 和 stop 服务的脚本创建一个模板。我正在检查 tomcat 启动和停止的模板并查看命令 RETVAL=$?。 这是做什么的?我应该保留它吗?顺便说一句,我的脚本在下面,以
我得到这个 Valgrind 输出(这是我得到的唯一错误): ==20627== Conditional jump or move depends on uninitialised value(s)
我在尝试访问 pthread_join 的第四个参数时遇到段错误。这是我的代码: void* threadHandler(void* arg) { printf("arg: %c\n", *(ch
我在尝试访问 pthread_join 的第四个参数时遇到段错误。这是我的代码: void* threadHandler(void* arg) { printf("arg: %c\n", *(ch
[in]、[out]、[in, out] 和 [out, retval] 有什么区别 ? 从我读过的一些代码来看,我认为 [in] 用于将参数传递给一个方法。 [out, retval]就是返回一个值
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我正在扫描字符串对象数组,每个字符串对象将被分解为一个正则表达式。 当进行增强的 for 循环时,我想知道是否可以将 retval 放入数组中? 例如,如果我有 String regex = new
我正在尝试使用 clang 3.6 和 -Weverything 编译一个 C 文件,但它在我的 Doxygen 注释中失败,其中包含 \retval 标记。 我的代码是这样的: /*********
我有以下内容: void *Thrd(void *data) { int ret; ret = myfunc(); pthread_exit((void *)ret); } i
我目前正在使用 Diab 4.4 C++ 编译器。这是一个完整的 POS,不符合 ANSI,我过去发现过它的问题。 我想知道下面的问题是编译器的问题,还是我对C++知识的不足 我意识到 x = x &
我想写一个这样的 C++ 函数: #include std::errc f() { return std::errc::success; } 但我无法理解如何使用 std::errc 'enum c
我很难理解为什么 pthread_join 的 retval 参数是 void**。我已经阅读了联机帮助页并试图全神贯注,但我仍然无法完全理解它。我无法说服自己 retval 不能是 void*。有哪
我很难理解为什么 pthread_join 的 retval 参数是 void**。我已经阅读了联机帮助页并试图全神贯注,但我仍然无法完全理解它。我无法说服自己 retval 不能是 void*。有哪
我正在尝试使用 papi 进行测试,但遇到一些错误,我不明白为什么会发生这些错误。我在网上找不到任何适合他们的东西。代码如下 我正在使用PAPI和C。 #include #include #inc
我一直在寻求改进和应用最佳实践。在过去的几周里,我读了很多关于重构的文章。我不得不处理很多糟糕的代码,我也制作了一些不太好的东西,但我正在努力改变它。这对大多数语言来说都没有问题,但我对 PL/SQL
我有一个现有的接口(interface) API,它有一个 OUT、RETVAL 参数,如下所示 HRESULT Test([out, retval] VARIANT_BOOL *pVal); 我被要
我有一个返回结构(不是结构指针)的函数,但是当试图将返回值设置为相同类型的结构变量时,我得到“不兼容的类型”。 这是结构定义和函数实现的样子: typedef struct{ int ssn;
我正在尝试更新现有的 COM API 以包含新的可选输出参数,但遇到了 IDL 文件和关联的 C++ 头文件中参数类型强制排序的问题。 以前我有一个像这样的 IDL 文件(为了保护无辜者更改了名称):
我是一名优秀的程序员,十分优秀!