2017-02-07 20 views
0

ストアドプロシージャの一部の変更は、Oracleによって認識されていないようです...ストアドプロシージャの一部の変更が反映されていないようです

たとえば、プロシージャにパラメータを追加し、再コンパイルして(DataGrip-speakで)、コードから呼び出しました。それはうまくいくように見えましたが、新しいパラメータを受け入れていました。

しかし、タイプ「INT」を間違えてしまいましたが、これは有効なタイプではありません。私は "NUMBER"に変更しようとしましたが、動作は同じです。

私を説明しましょう。私はテーブルにプライマリキーを追加しました(ちょっと、私を判断せず、実際にはプライマリキーなしでテーブルを作成することはありませんでした)、それを以前のプログラマが持っていたストアドプロシージャのパラメータとして追加しました挿入または更新のいずれかを行います。しかし、ユニーク制約として使用していた値は、もはやユニークではないことが判明したので、プライマリキーを追加しました。

ただし、プロシージャを実行するたびに、新しい行を追加する代わりに、1つのフィールドに同じ値が設定されているため、既存の行が更新されます。これは、IDパラメータが新しい行であるということを認識しないかのようです。明確にするために、以下のコードを参照してください。

幸い私にとっては、同僚が以前にこの問題に遭遇していて、プロシージャ定義をコピーして名前を変更してコミットし、実行すればうまくいくと私に通知しました。だから私はやった。それはそうです。

ストア・プロシージャの変更がOracleによって認識され、一部の変更が変更されない理由を知っている人はいますか?これとキャッシュとの関係、またはOracleがこれらの手順を保存する方法は何ですか?自動的に実行されないので、プロシージャの記憶域を「リフレッシュ」するために実行できるコマンドはありますか?

ありがとうございました!

ここには3つのバージョンのプロシージャがあります:オリジナル、私の最初の変更は認識されました。私の2回目の変更はありませんでした。

create PROCEDURE  proc_name_removed_for_privacy 
    ( v_Month_Year IN VARCHAR2, 
    v_Title IN VARCHAR2, 
    v_UserID IN VARCHAR2, 
    v_Visible IN CHAR 
    ) 
    as 

v_IsNew CHAR(1):= 'T'; 

BEGIN 
    SELECT DECODE(COUNT(Month_Year),0,'T','F') INTO v_IsNew 
     FROM table_name_removed_for_privacy 
    WHERE Month_Year = v_Month_Year; 

     IF UPPER(TRIM(v_IsNew)) = 'T' THEN 
     INSERT INTO table_name_removed_for_privacy 
     (
      Month_Year, 
      Title, 
      created_by, 
      date_added, 
      modified_by, 
      date_modified, 
      visible 
     ) 
     VALUES(v_Month_Year,v_Title,v_UserID,SYSDATE,v_UserID,SYSDATE,v_Visible); 
     COMMIT; 
    ELSE 
     UPDATE table_name_removed_for_privacy 
      SET Title = v_Title, 
       modified_by = v_UserID, 
       date_modified = SYSDATE, 
       visible = v_Visible 
     WHERE Month_Year = v_Month_Year; 
     COMMIT; 

    END IF; 

END; -- Procedure 

第二:

create PROCEDURE  proc_name_removed_for_privacy 
(
    v_Month_Year IN VARCHAR2, 
    v_Title IN VARCHAR2, 
    v_UserID IN VARCHAR2, 
    v_Visible IN CHAR, 
    v_ID IN INT DEFAULT -1 
) as 

BEGIN 
    IF v_ID = -1 THEN 
     INSERT INTO table_name_removed_for_privacy 
     (
      Month_Year, 
      Title, 
      created_by, 
      date_added, 
      modified_by, 
      date_modified, 
      visible 
     ) 
     VALUES(v_Month_Year,v_Title,v_UserID,SYSDATE,v_UserID,SYSDATE,v_Visible); 
     COMMIT; 
    ELSE 
     UPDATE table_name_removed_for_privacy 
     SET Title = v_Title, 
      modified_by = v_UserID, 
      date_modified = SYSDATE, 
      visible = v_Visible 
     WHERE ID = v_ID; 
     COMMIT; 
    END IF; 
END; -- Procedure 

サード:

create PROCEDURE  proc_name_removed_for_privacy 
(
    v_Month_Year IN VARCHAR2, 
    v_Title IN VARCHAR2, 
    v_UserID IN VARCHAR2, 
    v_Visible IN CHAR, 
    v_ID IN NUMBER DEFAULT -1 
) as 

BEGIN 
    IF v_ID = -1 THEN 
     INSERT INTO table_name_removed_for_privacy 
     (
      Month_Year, 
      Title, 
      created_by, 
      date_added, 
      modified_by, 
      date_modified, 
      visible 
     ) 
     VALUES(v_Month_Year,v_Title,v_UserID,SYSDATE,v_UserID,SYSDATE,v_Visible); 
     COMMIT; 
    ELSE 
     UPDATE table_name_removed_for_privacy 
     SET Title = v_Title, 
      modified_by = v_UserID, 
      date_modified = SYSDATE, 
      visible = v_Visible 
     WHERE ID = v_ID; 
     COMMIT; 
    END IF; 
END; -- Procedure 
+0

実際、私が記述した動作に基づいて、私が行った変更のどれもがOracleによって全く認識されていなかったと思いました。これは、既存のv_Month_Year元のprocに見られるような値。 WTF。 – MystikDan

+0

'INT'は' NUMBER'のサブタイプです。 [oracle doc](https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/datatypes.htm) –

+0

*プロシージャ定義をコピーし、名前を変更してコミットします。*パラメータを追加するには、ALTERを使用します手順。それは強制的に再コンパイルする必要があります。ところで、私はDDLステートメントは通常、自動コミットと考えているので、何もしないでください。 – Leigh

答えて

0

試してみてください。

create or replace procedure ... 

オリジナルv_IDパラメータに注意してください。

私の推測は、あなたが新しい定義でプロシージャを "更新"していると思うので、実際にはエラー出力しているということです。 「作成または置換」を使用すると、Oracleに、新規の新しいプロシージャを新しいコードで更新するかどうかを指示します。

これはわかりませんが(私はスクリプトを実行していません)、「作成または置換」ではなく「プロシージャの作成」が表示されたら、フラグが立てられます。

希望に役立ちます!

+0

これは質問への答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](レビュー/低品質の投稿/ 15135847) – Robert

+0

@Robertもし私が正しいなら、それは問題を解決するはずです。私はもっ​​と時間があるときにもっと説明しようとします、ありがとう – tbone

+0

@tboneそれはしましたが、それは毎回働いていません。幸運にも私の手続きは今働いていますが、私は依然としてOracleの手続きの更新や置き換えに矛盾しています。 – MystikDan

関連する問題