【问题标题】:Why me store procedure just return the result of the first IF?为什么我的存储过程只返回第一个 IF 的结果?
【发布时间】:2021-07-10 10:26:30
【问题描述】:

我在 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 
  @

但是当调用过程并在第二个参数中输入任何值时,更新的行只在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

【问题讨论】:

  • 您的 if 语句比较的是文字字符串,而不是变量与数字。
  • 请用您正在使用的 DBMS 标记您的问题。但是, in_Leader_Score 被定义为一个整数,但在您的代码中您将其视为一个字符串 - 因此您的比较代码不会以您想要的方式工作。 >= 80 和 >= '80' 不一样
  • 当我尝试以这种方式进行比较时:>=80,当我尝试调用该函数时收到此错误:状态:失败错误消息在字符串参数中找到无效字符函数“DECFLOAT”.. SQLCODE=-420, SQLSTATE=22018, DRIVER=4.26.14
  • 我的男孩和女孩是一个注意错误,我的变量输入错误,我将变量定义为 in_Leader_Score,并且在 IF-ELSE 语句中我输入了_Leaders_Score,因此更正此我删除了所有引号IF-ELSE 比较,代码运行良好!非常感谢!!!

标签: sql if-statement stored-procedures db2


【解决方案1】:

现在这里是正确的代码:

--#SET TERMINATOR @
CREATE PROCEDURE UPDATE_LEADERS_SCORE (
    IN in_School_ID  INTEGER, IN 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_Leader_Score >=  80 THEN 
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Very_Strong'
        WHERE "School_ID" = in_School_ID;
    ELSEIF in_Leader_Score>= 60 and in_Leader_Score <= 79  THEN
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Strong'
        WHERE "School_ID" = in_School_ID;
    ELSEIF in_Leader_Score >=  40 and in_Leader_Score <= 59  THEN
        UPDATE "CHICAGO_PUBLIC_SCHOOLS"
        SET "Leaders_Icon" = 'Average'
        WHERE "School_ID" = in_School_ID;
    ELSEIF in_Leader_Score >=  20 and in_Leader_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 
  @

感谢有识之士

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

    • 感谢马克的建议,在接下来的问题中,我将尝试制作更清晰的代码。
    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多