为什么我的存储过程只返回第一个 IF 的结果?

时间:2021-04-15 11:22:17

标签: sql if-statement stored-procedures db2

我在 SQL 中使用此代码

--#SET TERMINATOR @
CREATE PROCEDURE UPDATE_LEADERS_SCORE (
    IN in_School_ID INTEGER, in_Leader_Score INTEGER) 
LANGUAGE SQL 
MODIFIES SQL DATA
  BEGIN
    UPDATE "CHICAGO_PUBLIC_SCHOOLS"
    SET "Leaders_Score" = in_Leader_Score
    WHERE "School_ID" = in_School_ID;
    IF 'in_Leaders_Score' >=  '80' THEN 
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Very_Strong'
        WHERE "School_ID" = in_School_ID;
    ELSEIF 'in_Leaders_Score' >= '60' and 'in_Leaders_Score' <= '79'  THEN
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Strong'
        WHERE "School_ID" = in_School_ID;
    ELSEIF 'in_Leaders_Score' >=  '40' and 'in_Leaders_Score' <=  '59'  THEN
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Average'
        WHERE "School_ID" = in_School_ID;
    ELSEIF 'in_Leaders_Score' >=  '20' and 'in_Leaders_Score' <=  '39'  THEN
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Weak'
        WHERE "School_ID" = in_School_ID;
    ELSE
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Very Weak'
        WHERE "School_ID" = in_School_ID;
        END IF;
  END 
  @

但是当a调用该过程并在第二个参数中设置任何值时,更新的行只返回Leaders Icon列中的字符串“Very_Strong”,可以给我一个提示吗?

我已经尝试在这种模式下进行比较 =>80 我收到了这个错误:

状态: 失败的 错误信息 在函数“DECFLOAT”的字符串参数中发现无效字符.. SQLCODE=-420, SQLSTATE=22018, DRIVER=4.26.14

我尝试将 'in_Leaders_Score' 放在单引号中,但没有出错,但代码没有进行正确的比较,如果我将此变量放入双引号或不带引号中,则会出现此错误: 错误信息: “LEADERS_SCORE”在使用它的上下文中无效.. SQLCODE=-206, SQLSTATE=42703, DRIVER=4.26.14

2 个答案:

答案 0 :(得分:0)

现在是正确的代码:

{{1}}

Tks 给 insigths 人

答案 1 :(得分:0)

我不建议你以后做这样的事情。
整个逻辑可以只用一条语句来实现,这样可读性更强。

UPDATE "CHICAGO_PUBLIC_SCHOOLS"
SET 
   "Leaders_Score" = in_Leader_Score
,  "Leaders_Icon" = 
   CASE 
     WHEN in_Leader_Score >= 80                            
       THEN 'Very_Strong'
     WHEN in_Leader_Score >= 60 and in_Leader_Score <= 79  
       THEN 'Strong'
     WHEN in_Leader_Score >= 40 and in_Leader_Score <= 59  
       THEN 'Average'
     WHEN in_Leader_Score >= 20 and in_Leader_Score <= 39  
       THEN 'Weak'
     ELSE 'Very Weak'
   END
WHERE "School_ID" = in_School_ID;