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;
你是金色的。总是把一切都化名
总是给每件事都加上别名
我应该使用什么替代方法?尝试不带:
仅请求编号的过程我应该使用什么替代方法?尝试不带:
仅请求编号的过程