Sum*_*mit 3 sql plsql stored-procedures oracle10g sql-update
我在 Oracle 中创建了一个存储过程。程序编译成功,没有错误。该过程有 3 个 UPDATE 查询,它们更新 3 个表“TBLHOTEL”、“TBLHOTELDETAIL”和“TBLHOTELFARE”。
在每个 Update 语句之后,一个变量 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;
Run Code Online (Sandbox Code Playgroud)
呼吁声明
DECLARE
C number;
BEGIN
TableUpdateByParameter (140,200,TO_DATE('03/24/2013','MM/DD/YYYY'),'H1',3000,'GANGTOK','TRIPTI','AC',C);
END;
Run Code Online (Sandbox Code Playgroud)
数据库管理系统输出:
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
Run Code Online (Sandbox Code Playgroud)
请帮我找出问题所在。如果需要额外的信息,请告诉我。
该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' ;
Run Code Online (Sandbox Code Playgroud)
我认为您想更新具有hotelid
作为参数传递的值的列的行。这有几个问题:
p_
.p_date1
是日期类型,所以不需要该to_date
函数)。因此,如果您重命名参数p_hotelid
and p_date1
,则语句应为:
UPDATE tblhotel
SET acrooms = acrooms, nacrooms = nacrooms
WHERE date1 = p_date1
AND hotelid = p_hotelid;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不会出现混淆或转换错误。
在一个不相关的注释上:
when others
,让错误传播。如果错误传播,PL/SQL将回滚过程更改。PL/SQL 语句(DML 和块)本质上是原子的,它们要么完全失败,要么完全成功。