【发布时间】:2017-11-13 20:03:49
【问题描述】:
我正在尝试通过将值增加“inc”来更新汽车的“damage_amt”,但仅适用于“year”年发生的事故。
CREATE or REPLACE PROCEDURE updateDMG(xyear VARCHAR2, inc NUMBER) AS
CURSOR cur1 IS
select a.DAMAGE_AMT
from participated a join accident b
on a.report_nr = b.report_nr
for update;
p_dmg PARTICPATED.damage_amt%TYPE;
p_year NUMBER;
inc_dmg NUMBER;
BEGIN
p_year:=xyear;
inc_dmg:=inc;
OPEN cur1;
LOOP
FETCH cur1 bulk collect INTO p_dmg;
EXIT WHEN cur1%NOTFOUND;
UPDATE PARTICIPATED
SET damage_amt = damage_amt * inc_dmg
WHERE p_dmg like xyear;
END LOOP;
CLOSE cur1;
END updateDMG;
/
EXEC updateDMG('08', 0.10);
但我得到了错误:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: begin function pragma procedure subtype <an identifier> <a double-quoted delimited-identifier> current cursor delete exists prior
显然我对这类答案的语法缺乏了解。谁能指出我的错误?我似乎无法通过搜索找到任何东西。
编辑:在 END 之后缺少 /。现在它实际上并没有更新行。
最终编辑:想通了。我认为我的一些变量是不必要的,但我可能是错的。
CREATE or REPLACE PROCEDURE updateDMG(xyear NUMBER, inc DECIMAL) AS
CURSOR cur1 IS
select a.DAMAGE_AMT, extract(year from b.ACCIDENT_DATE)
from participated a join accident b
on a.report_nr = b.report_nr
for update;
p_dmg PARTICIPATED.damage_amt%TYPE;
p_year NUMBER;
input_year NUMBER;
inc_dmg DECIMAL;
BEGIN
input_year:=xyear;
inc_dmg:=inc;
OPEN cur1;
FETCH cur1 INTO p_dmg, p_year;
MERGE INTO PARTICIPATED x
USING ACCIDENT y
ON (x.report_nr = y.report_nr)
WHEN MATCHED THEN
UPDATE SET x.damage_amt = x.damage_amt * (1 + inc_dmg/100)
WHERE extract(year from y.accident_date) = input_year;
CLOSE cur1;
END updateDMG;
/
EXEC updateDMG(2008, 10);
【问题讨论】:
-
如果这只是一个脚本,您可能只是在最后一个
END和EXEC调用之间缺少一个/? -
这可以解决错误!我能够修复一些其他语法错误,我将在上面进行编辑。现在,它没有更新任何行,因为在我的 LOOP 中,WHERE 条件使用 LIKE 检查年份,但我在调用中传递的参数不使用 %。
标签: oracle stored-procedures plsql cursor