アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。
Oracle9i+WindowsXPの環境で、以下のようなトリガーをテーブル更新or挿入タイミングで起動させ、更新対象行をログのような形でUTL_FILEパッケージを使用してCSVファイルを作成しようとしておりますが、テーブルを更新してもエラーが発生します。

create or replace procedure kan_proc(aaa in number)
is
PRAGMA AUTONOMOUS_TRANSACTION;
file UTL_FILE.FILE_TYPE;
filename varchar2(10);
BEGIN
filename := 'aaa.csv';
file := UTL_FILE.FOPEN('FILE_PATH', filename, 'w');
UTL_FILE.PUT_LINE(file, aaa);


END kan_exp;
/

create or replace trigger kan_trg
after update or insert on t_kan
each row
aaa number
begin
if updating then
select colA into aaa from t_kan where :new.colA = colA;
kan_proc(aaa);
else if inserting then
???
end;
/

エラーNo.はちょっと今はわかりませんが、必要であれば提示させていただきます。
全く自信がないのですが更新時上記のようなSQL文で更新対象行がとれるものなのでしょうか?
また、ちょっと別問題ですが、挿入時のコードが思いつきませんが、何か良い方法はありますでしょうか?
申し訳ありませんがどなたかご教授いただけませんでしょうか?
宜しくお願い致します。

A 回答 (3件)

ログへの出力は、トランザクション不成立の場合でも記録して良いんですか?


当初、自律型トランザクションを書いているくらいなので、トランザクションの成否にかかわらず、
挿入/更新の行為があった場合、記録するのが目的のような気がしますけど、AFTERトリガだし・・

極端なケースですが、トランザクションがなんらかのエラーでロールバックの場合でもUTL_FILEで出力した分はそのまま、
但し、エラーを引き起こす場所が、AFTERトリガの前だと、エラー該当レコードに関する記録はされずに終わる。
という微妙なログのような気がします。
    • good
    • 0
この回答へのお礼

コメントありがとうございます!

>トランザクション不成立の場合でも記録して良いんですか?

不成立の場合は記録したくないです。。

>当初、自律型トランザクションを書いているくらいなので、トランザク
ションの成否にかかわらず、
挿入/更新の行為があった場合、記録するのが目的のような気がしますけど、AFTERトリガだし・・

自律型トランザクションは正直よくわからず書きました。以前の本サイトの質問にて、同様にトリガーを作成してテーブル更新時ビュー作成しようとして上手くいかず、自律型トランザクションを教えていただきました。

どのようにすればトランザクション成立の場合のみ記録できるのでしょうか?
よろしければご教授いただけませんでしょうか?宜しくお願いします。

お礼日時:2009/01/12 19:21

SQL単文でなくトランザクションの成否を要素とするなら、ROWレベルトリガでファイル出力は無理があります。


ログの出力先をオラクル上のテーブルとし、事後にファイル出力する形態にした方が無難かと思いますよ。
なお、自律型トランザクションは、トランザクションが独立してしまい、本体トランザクションの成否に関わらず、
動作してしまいます、今回の場合は、使ってはなりません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
もしよろしければ、サンプルコードなどご提示いただけませんでしょうか?

お礼日時:2009/01/14 02:56

・:NEW.ColAに更新後の値が入っていると分かっているのに、なぜ改めてテーブルを検索しているのですか?


・inserting/updatingともに更新後の値しか記録する必要がないなら、insertingとupdatingで場合わけをする必要がありません。
・'w'では、毎回上書きされて、結局1行しか記録されません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!
すいません。なんか完全に勘違いしてました。

create or replace trigger kan_trg
after update or insert on t_kan
each row
aaa number
file UTL_FILE.FILE_TYPE;
filename varchar2(10);
BEGIN
filename := 'aaa.csv';
file := UTL_FILE.FOPEN('FILE_PATH', filename, 'a');
UTL_FILE.PUT_LINE(file, :new.colA);


end;
/

てな感じでよろしいんでしょうか?
明日動作確認してみます。
ありがとうございました。

お礼日時:2009/01/12 01:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す