2011-06-24 14 views
2

私は単一のキャンバスに2つのブロックを持つOracle Form(10g)を作成しています。上のブロックはQUERY_BLOCKと呼ばれ、PRICING_BLOCKにデータの行を埋め込むためにユーザーが入力します。Oracle Forms - フォーム全体ではなく単一のSQL文をコミットします

しかし、QUERY_BLOCKには、それぞれデータベースでINSERTとDELETEを実行する必要があるチェックボックスもあります。私のWHEN-CHECKBOX-CHANGEDトリガーは、次のようになります。

begin 
    if :query_block.profile_code is not null then 

     if :query_block.CHECKBOX_FLAG = 'Y' then 
      begin 
       INSERT INTO profile_table VALUES ('Y', :query_block.profile_code); 
      end; 
     else 
      begin 
       DELETE FROM profile_table WHERE profile_code = :query_block.profile_code and profile_type_code = 'FR'; 
      end; 
     end if; 
    end if; 
end; 

私はそうでないレコードロックと何も、私はここに文をコミットのいくつかの並べ替えを追加する必要があることを知って、実際に起こります。しかし、私がCOMMITをしたら、フォーム全体が検証され、変更された行が更新されます。

残りのフォームを更新せずにこれらの1行のクエリを実行するにはどうすればよいですか?

答えて

2

本の実際の知恵にコメントがなければ、あなたは行って、データベースにプロシージャを作成することができautonomous transaction

CREATE OR REPLACE FUNCTION my_fnc(p_flag IN VARCHAR2) 
    RETURN VARCHAR2 IS 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    IF p_flag = 'Y' THEN 
    INSERT... 
    ELSE 
    DELETE... 
    END IF; 
    COMMIT; 
    RETURN 'SUCCESS'; 
EXCPTION 
    WHEN OTHERS THEN 
    RETURN 'FAIL'; 
END;  

のようにフォームのコードはその後になります:

begin 
    if :query_block.profile_code is not null then 
     stat := my_fnc(:query_block.CHECKBOX_FLAG); 
    end if; 
end; 

はこれが可能に呼び出し元のトランザクションとは独立してコミットする関数。ただし、これに注意してください。外部トランザクションをロールバックする必要がある場合、自律型トランザクションは引き続きコミットされます。私はあなたのロック問題を解決するために必要なことを行うためのトランザクション方法があるべきだと考えています。これは優れた方法でしょう。あなたのプロセスの詳細を知らなければ、私は理解できません。一般に、自律型トランザクションは、トランザクションがコミットするかロールバックするか(例えば、ロギング)にかかわらず、更新が行われなければならないときに使用される。

関連する問題