gpt4 book ai didi

sql - UPDATE 语句在存储过程中不起作用;没有错误,也没有发生异常

转载 作者:行者123 更新时间:2023-12-04 20:08:14 25 4
gpt4 key购买 nike

我在 Oracle 中创建了一个存储过程。该过程编译成功,没有错误。该过程有 3 个 UPDATE 查询,更新 3 个表 'TBLHOTEL'、'TBLHOTELDETAIL' 和 'TBLHOTELFARE'。

在每个更新语句之后,变量successCnt1 会递增以获取成功插入查询的数量。最后将successCnt1赋值给successCnt来存储最终结果。如果在任何查询中发生异常,则将其设置为 0 ,表示没有发生插入。

问题是没有发生异常,数据库也没有发生更新。

这是我的代码:

架构:

TBLHOTEL 架构: {DATE1 (DATE) , ACROOMS (NUMBER) , NACROOMS (NUMBER), HOTELID (VARCHAR2(10)) }

TBLHOTELFARE 架构: {HOTELID (VARCHAR2(10)), CLASS (VARCHAR2(5)), FARE (NUMBER)}

TBLHOTELDETAIL 架构: {HOTELID (VARCHAR2(10)) , PLACE (VARCHAR2(15)) , HOTELNAME (VARCHAR2(15)) }

程序:

CREATE OR REPLACE PROCEDURE TableUpdateByParameter (acrooms   in number,
nacrooms in number,
date1 in date,
hotelid in varchar2,
fare in number,
place in varchar2,
hotelname in varchar2,
class in varchar2,
successCnt out number) IS

successCnt1 number(6) NOT NULL := 0;
rowUpdated1 number(6) NOT NULL := 0;
rowUpdated2 number(6) NOT NULL := 0;
rowUpdated3 number(6) NOT NULL := 0;

BEGIN
SAVEPOINT before;

UPDATE tblhotel
SET acrooms = acrooms, nacrooms = nacrooms
WHERE date1 = (to_date(date1, 'mm/dd/yyyy'))
AND hotelid = 'hotelid' ;

rowUpdated1 := SQL%RowCount;
successCnt1 := successCnt1 + 1;

dbms_output.put_line('Successful Insertion tblhotel. count ='||successCnt1);
dbms_output.put_line('Successful Insertion tblhotel. Row Updated ='||rowUpdated1);

UPDATE tblhoteldetail
SET place = 'place', hotelname = 'hotelname'
WHERE hotelid = 'hotelid' ;

rowUpdated2 := SQL%RowCount;
successCnt1 := successCnt1 + 1;

dbms_output.put_line('Successful Insertion tblhoteldetail. count ='||successCnt1);
dbms_output.put_line('Successful Insertion tblhoteldetail. Row Updated= '||rowUpdated2);

UPDATE tblhotelfare
SET fare = fare
WHERE hotelid = 'hotelid'
AND class = 'class';

rowUpdated3 := SQL%RowCount;
successCnt1 := successCnt1 + 1;
successCnt := successCnt1;

COMMIT;

dbms_output.put_line('Successful Insertion tblhotelfare. count ='||successCnt);
dbms_output.put_line('Successful Insertion tblhotelfare. Row Updated= '||rowUpdated3);

EXCEPTION
WHEN Others THEN
successCnt1 := 0;
successCnt := successCnt1;
dbms_output.put_line('An error has occured. count ='||successCnt);

ROLLBACK TO before;

END;

来电声明

DECLARE 
C number;

BEGIN

TableUpdateByParameter (140,200,TO_DATE('03/24/2013','MM/DD/YYYY'),'H1',3000,'GANGTOK','TRIPTI','AC',C);
END;

DBMS 输出:

Successful Insertion tblhotel. count =1
Successful Insertion tblhotel. Row Updated =0
Successful Insertion tblhoteldetail. count =2
Successful Insertion tblhotel. Row Updated =0
Successful Insertion tblhotelfare. count =3
Successful Insertion tblhotel. Row Updated =0

请帮我找出问题所在。如果需要更多信息,请告诉我。

最佳答案

UPDATE 语句正在运行,但更新了 0 行,如您的日志所示 (Row Updated =0)。这不是错误,您的更新评估 where 子句,找到 0 行匹配,并执行 0 修改。在 Oracle 中,与 where 子句中的任何行都不匹配的更新仍然是成功的。

现在为什么会这样。让我们进行您的第一次更新:

UPDATE tblhotel
SET acrooms = acrooms, nacrooms = nacrooms
WHERE date1 = (to_date(date1, 'mm/dd/yyyy'))
AND hotelid = 'hotelid' ;

我认为您想使用作为参数传递的值更新具有列 hotelid 的行。有几个问题:

  • 首先,您不是在比较列和参数,而是在比较列与常数。参数不使用引号。常量(VARCHAR2)可以。
  • 其次,您不应该调用与您的列同名的参数,这会导致混淆,甚至可能导致 variable shadowing .我建议使用在您的架构中没有任何列使用的前缀。参数的一个常见前缀是 p_
  • 最后,如果你的参数是好的类型,你就不需要转换函数(因为你的参数 p_date1 是日期类型,你不需要 to_date 功能)。

因此,如果您将参数重命名为 p_hotelidp_date1,您的语句应为:

UPDATE tblhotel
SET acrooms = acrooms, nacrooms = nacrooms
WHERE date1 = p_date1
AND hotelid = p_hotelid;

在这种情况下,不会出现混淆或转换错误。


在不相关的注释上:

关于sql - UPDATE 语句在存储过程中不起作用;没有错误,也没有发生异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15683075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com