Sql 避免在带有多个条件的If语句中硬编码

Sql 避免在带有多个条件的If语句中硬编码,sql,arrays,oracle,plsql,Sql,Arrays,Oracle,Plsql,我有一段PL/SQL代码,看起来类似于: IF l_order = 'Cancelled At Order Stage' OR l_order = 'Stopped at Billing Stage' THEN Do something END IF; IF l_type = 'Internal' OR l_type = 'Contracted' THEN Do something else END IF; 我想避免硬编码字符串,所以我考虑了一个简单的数组。然而,似乎有很多额

我有一段PL/SQL代码,看起来类似于:

IF l_order = 'Cancelled At Order Stage' OR l_order = 'Stopped at Billing Stage' THEN
    Do something
END IF;

IF l_type = 'Internal' OR l_type = 'Contracted' THEN
    Do something else
END IF;
我想避免硬编码字符串,所以我考虑了一个简单的数组。然而,似乎有很多额外的代码行(创建一个类型,创建一个类型的数组,遍历该数组)只是为了完成我在这里得到的

关于在这里做什么有什么建议?我知道这是一个非常小的问题,我可能是微观优化,但我想知道什么是好的做法

$A := Hard-coding
$B := bad
$C := weigh
$D := advantage
$E := configurability
$F := cost
$G := reduced readability
$A并不总是$B。你必须$C$E的$D和$G的$F

这取决于你决定在你的系统中什么是有意义的。例如,如果开发人员每天看到十几次“在订单阶段取消”这个短语,阅读它就不需要思考。如果用C_CANCEL_STATUS替换该短语,代码的可读性就会降低


或者您可能只需要一点PL/SQL语法糖。例如,使用预定义集合和运算符的
成员可能有助于简化操作:

declare
    c_cancelled_statuses constant sys.dbms_debug_vc2coll := 
        sys.dbms_debug_vc2coll('Cancelled At Order Stage', 'Stopped at Billing Stage');
begin
    if 'Cancelled At Order Stage' member of c_cancelled_statuses then
        dbms_output.put_line('Cancelled!');
    end if;
end;
/

所有程序员都明白硬编码可能是不好的(对吧?)。硬编码可能会伤害代码,但可能不会杀死它


但我已经看到好几个系统被完全摧毁了。我知道太多的经理认为任何一行代码都是“硬编码的”,所有逻辑都应该存储在配置表中。由于害怕硬编码,许多可怕的专有编程语言已经被构建。偶尔硬编码也不要觉得太糟糕。

您可以将字符串参数化为局部变量,如
l_cancelled:=“在订单阶段取消”
并将它们都放在函数/proc/package的顶部。@mmmmm pie:这是我的想法。您是否总是建议这样做以避免硬编码,即使只有一个变量?其次,您是否总是将它们放在函数/包的顶部,或者将它们放在所需的特定块的正上方,这样它们就不会被声明/创建,除非需要?这取决于您喜欢代码的参数化方式。我见过架构师需要像“
charcomma=”,”这样的东西所以我完全同意这一点。第二,它的开发者/架构师偏好是在哪里定义它们。PL/SQL关心在哪里填充它们吗?没有,但可读性可能会。如果我必须在您后面处理代码,我宁愿将这些字符串声明a)存储在DB本身的表中(如flex字段),或者b)在开始时填充。第三,你不应该声明变量,如果你发现自己处于这种情况,你就永远不会使用。用声明的常量替换硬编码值的好处部分是为了避免重复,但主要是为了便于维护;如果值发生更改,则修复常量,而不是字符串的所有引用。如果您声明的常量太接近硬编码值所在的位置,那么您可能仍然会在不同的代码中重复该常量,并且您仍然需要在整个文件中查找并替换内容-仅使用一个引用。您最好保留硬编码值。所有常量都在存储单元的顶部,或者在一个专用的包中,因此您确切地知道在何处查找它们。同意,@AlexPoole。我在找一些ANSI必须说的东西,但是找不到任何东西。就像你在21点15的时候做的那样。。。无论你做什么,都要一直做。我喜欢这个。我觉得我在这里太挑剔了。我认为事情可能是这样的。它是可读的,并且可以立即理解,我认为我所做的任何改变都会使它变得不那么容易。