【问题标题】:Update statement where condtion is neglected忽略条件的更新语句
【发布时间】:2020-03-01 17:43:25
【问题描述】:

当我调用此过程时,它会更新表中的所有行,并忽略 where 条件:

PROCEDURE update_sto_status (REQUEST_NUMBER     IN VARCHAR2,
                                     SHIPMENT_NUMBERS   IN VARCHAR2)
IS
BEGIN
    UPDATE apps.table1 OH
    SET OH.comments = SHIPMENT_NUMBERS
    WHERE OH.REQUEST_NUMBER = :REQUEST_NUMBER;
END;

【问题讨论】:

    标签: sql oracle stored-procedures plsql where-clause


    【解决方案1】:

    你应该给你的过程的参数指定其他名称而不是表中的列,否则它们会变得不明确。

    基本上,表达方式:

    WHERE OH.REQUEST_NUMBER = REQUEST_NUMBER
    

    等号右边的REQUEST_NUMBER 被理解为列名,而不是参数。此条件始终为真,您最终会开始更新每条记录。

    PROCEDURE update_sto_status (
        P_REQUEST_NUMBER   IN VARCHAR2,
        P_SHIPMENT_NUMBERS IN VARCHAR2
    )
    IS
    BEGIN
        UPDATE apps.table1
        SET comments = P_SHIPMENT_NUMBERS
        WHERE request_number = P_REQUEST_NUMBER;
    END;
    

    【讨论】:

      【解决方案2】:

      当 PL/SQL 变量或参数名称与表中的列名发生冲突时,编译器总是倾向于 SQL 语句中的列名。在本例中,您将参数命名为 REQUEST_NUMBER,这与名为 REQUEST_NUMBER 的列相同。所以你的陈述相当于

      PROCEDURE update_sto_status (REQUEST_NUMBER     IN VARCHAR2,
                                   SHIPMENT_NUMBERS   IN VARCHAR2)
      IS
      BEGIN
          UPDATE apps.table1 OH
          SET OH.comments = SHIPMENT_NUMBERS
          WHERE OH.REQUEST_NUMBER = OH.REQUEST_NUMBER;
      END;
      

      上面的比较总是正确的,所以每一行都会更新。

      解决方法:输入参数为pin,输出参数为pout,输入/输出参数为pio。那么你的程序就变成了

      PROCEDURE update_sto_status (pinREQUEST_NUMBER     IN VARCHAR2,
                                   pinSHIPMENT_NUMBERS   IN VARCHAR2)
      IS
      BEGIN
          UPDATE apps.table1 OH
          SET OH.comments = pinSHIPMENT_NUMBERS
          WHERE OH.REQUEST_NUMBER = pinREQUEST_NUMBER;
      END;
      

      你是金子。

      【讨论】:

        【解决方案3】:

        尽量避免:

          PROCEDURE update_sto_status (REQUEST_NUMBER     IN VARCHAR2,
                                         SHIPMENT_NUMBERS   IN VARCHAR2)
          IS
         BEGIN
           UPDATE apps.table1 OH
           SET OH.comments = SHIPMENT_NUMBERS
           WHERE OH.REQUEST_NUMBER = REQUEST_NUMBER;
         END;
        

        【讨论】:

        • 我应该改用什么?
        • 在没有:的情况下尝试该过程,只需REQUEST_NUMBER
        【解决方案4】:

        总是给所有东西起别名。

        PROCEDURE update_sto_status (REQUEST_NUMBER     IN VARCHAR2,
                                         SHIPMENT_NUMBERS   IN VARCHAR2)
        IS
        BEGIN
            UPDATE apps.table1 OH
            SET OH.comments = update_sto_status.SHIPMENT_NUMBERS
            WHERE OH.REQUEST_NUMBER = update_sto_status.REQUEST_NUMBER;
        END;
        

        【讨论】:

          猜你喜欢
          • 2012-07-15
          • 2016-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-22
          • 1970-01-01
          • 2018-12-07
          • 1970-01-01
          相关资源
          最近更新 更多