给定v_ssn_ind INTEGER := IF TRIM(p_ssn) IS NULL THEN 0 ELSE 1 END IF;
我知道我可以这样做:IF v_ssn_ind=1 THEN…
但我可以进行短路评估,即:IF v_ssn_ind THEN…
?
答案 0 :(得分:6)
首先,你所谈论的内容似乎与short-circuit evaluation没有任何关系。当像
这样的代码时,短路评估就会出现IF( quick_condition AND slow_condition )
THEN
<<do something>>
END IF;
当且仅当初始快速条件的计算结果为TRUE时,才会计算第二个慢速条件。
其次,将值赋值给v_ssn_ind
在语法上无效。
第三,不,你不能说
IF <<integer variable>>
THEN
因为这没有意义。什么值会评估为TRUE,哪些值会评估为FALSE?例如,如果0为FALSE且1为TRUE,那么17将转换为什么?
如果要声明某种指示符变量,通常使用BOOLEAN
数据类型而不是整数是有意义的。如果使用布尔值,则可以执行
IF <<boolean variable>>
THEN
因为这消除了歧义。这不会比将= TRUE
添加到您的IF条件更快。
答案 1 :(得分:0)
我不鼓励你将任何逻辑放入声明块中,在我看来它会使代码不那么清晰。
而是IF
您可以使用CASE
声明。
...
v_ssn_ind INTEGER;
BEGIN
v_ssn_ind := CASE TRIM(p_ssn) IS NULL WHEN TRUE THEN 0 ELSE 1 END;
...
但我个人会为BOOLEAN
v_ssn_ind
类型
...
v_ssn_ind BOOLEAN;
BEGIN
v_ssn_ind := TRIM(p_ssn) IS NOT NULL;
...