0
私は、carの 'damage_amt'を 'inc'で値を増加させて更新しようとしていますが、 'year'に発生した事故に対してのみです。更新のためのOracle PL/SQLストアドプロシージャカーソル
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
は明らかに私は答えのこのタイプの構文上の知識を欠いています。誰も私のエラーを指摘できますか?私は検索から何かを見つけることができない。
EDIT:終了後に/がありませんでした。これで実際に行が更新されることはありません。
最終編集:それを実演しました。私の変数のいくつかは不要だと思いますが、間違っている可能性があります。
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);
これがすべて1つのスクリプトの場合、最終的な 'END'と' EXEC'呼び出しの間に '/'がありませんか? –
それはエラーを過ぎ去るために働いた!私は他の構文エラーを修正することができました。私は上でそれを編集します。現在、私のLOOPではWHERE条件がLIKEで年をチェックしているので、行を更新していませんが、通話で渡すパラメータは%を使用しません。 –