Sql 忽略条件的Update语句

Sql 忽略条件的Update语句,sql,oracle,stored-procedures,plsql,where-clause,Sql,Oracle,Stored Procedures,Plsql,Where Clause,当我调用此过程时,它会更新表中的所有行,并且忽略其中的条件: 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.RE

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

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;

尽量避免

  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;

尽量避免

  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;

您应该为过程的参数指定表中列以外的其他名称,否则它们会变得模棱两可

基本上,在表达上:

WHERE OH.REQUEST_NUMBER = REQUEST_NUMBER
等式右侧的
请求\u编号
在列名处理解,而不是作为参数。此条件始终为真,并且最终会更新每个记录begin

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;

您应该为过程的参数指定表中列以外的其他名称,否则它们会变得模棱两可

基本上,在表达上:

WHERE OH.REQUEST_NUMBER = REQUEST_NUMBER
等式右侧的
请求\u编号
在列名处理解,而不是作为参数。此条件始终为真,并且最终会更新每个记录begin

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;

当PL/SQL变量名或参数名与表中的列名发生冲突时,编译器总是在SQL语句中使用列名。在本例中,您将参数命名为
REQUEST\u NUMBER
,它与名为
REQUEST\u 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;

当PL/SQL变量或参数名与表中的列名发生冲突时,编译器总是支持SQL语句中的列名。在本例中,您将参数命名为
REQUEST\u NUMBER
,它与名为
REQUEST\u 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;
你是金色的。

总是把一切都化名

总是给每件事都加上别名


我应该使用什么替代方法?尝试不带
仅请求编号的过程我应该使用什么替代方法?尝试不带
仅请求编号的过程