2017-11-13 19 views
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); 
+2

これがすべて1つのスクリプトの場合、最終的な 'END'と' EXEC'呼び出しの間に '/'がありませんか? –

+0

それはエラーを過ぎ去るために働いた!私は他の構文エラーを修正することができました。私は上でそれを編集します。現在、私のLOOPではWHERE条件がLIKEで年をチェックしているので、行を更新していませんが、通話で渡すパラメータは%を使用しません。 –

答えて

0

私は完全な構文を確認するために、今のデータベースを持っていないが、私はこのような何かを示唆している:

CREATE OR REPLACE PROCEDURE updatedmg (p_year NUMBER, p_inc DECIMAL) 
AS 
    l_next_year NUMBER; 
    l_from_date DATE; 
    l_to_date  DATE; 
BEGIN 
    l_next_year := p_year + 1; 
    l_from_date := TO_DATE (p_year || '-01-01', 'RRRR-MM-DD'); 
    l_to_date := TO_DATE (l_next_year || '-01-01', 'RRRR-MM-DD'); 

    UPDATE participated pt 
     SET pt.damage_amt = pt.damage_amt * (1 + p_inc/100) 
    WHERE pd.report_nr IN (SELECT ad.report_nr 
          FROM accident ad 
          WHERE ad.accident_date >= l_from_date 
            AND ad.accident_date < l_to_date); 
END updatedmg; 

そのシンプルな、あなたはおそらく上のインデックスをよりよく利用することができ、そのようにテーブル。

私はそれが役に立ちそうです。

幸運を祈る!

関連する問題