いつもお世話になっております。
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文で更新対象行がとれるものなのでしょうか?
また、ちょっと別問題ですが、挿入時のコードが思いつきませんが、何か良い方法はありますでしょうか?
申し訳ありませんがどなたかご教授いただけませんでしょうか?
宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
ログへの出力は、トランザクション不成立の場合でも記録して良いんですか?
当初、自律型トランザクションを書いているくらいなので、トランザクションの成否にかかわらず、
挿入/更新の行為があった場合、記録するのが目的のような気がしますけど、AFTERトリガだし・・
極端なケースですが、トランザクションがなんらかのエラーでロールバックの場合でもUTL_FILEで出力した分はそのまま、
但し、エラーを引き起こす場所が、AFTERトリガの前だと、エラー該当レコードに関する記録はされずに終わる。
という微妙なログのような気がします。
コメントありがとうございます!
>トランザクション不成立の場合でも記録して良いんですか?
不成立の場合は記録したくないです。。
>当初、自律型トランザクションを書いているくらいなので、トランザク
ションの成否にかかわらず、
挿入/更新の行為があった場合、記録するのが目的のような気がしますけど、AFTERトリガだし・・
自律型トランザクションは正直よくわからず書きました。以前の本サイトの質問にて、同様にトリガーを作成してテーブル更新時ビュー作成しようとして上手くいかず、自律型トランザクションを教えていただきました。
どのようにすればトランザクション成立の場合のみ記録できるのでしょうか?
よろしければご教授いただけませんでしょうか?宜しくお願いします。
No.3
- 回答日時:
SQL単文でなくトランザクションの成否を要素とするなら、ROWレベルトリガでファイル出力は無理があります。
ログの出力先をオラクル上のテーブルとし、事後にファイル出力する形態にした方が無難かと思いますよ。
なお、自律型トランザクションは、トランザクションが独立してしまい、本体トランザクションの成否に関わらず、
動作してしまいます、今回の場合は、使ってはなりません。
No.1
- 回答日時:
・:NEW.ColAに更新後の値が入っていると分かっているのに、なぜ改めてテーブルを検索しているのですか?
・inserting/updatingともに更新後の値しか記録する必要がないなら、insertingとupdatingで場合わけをする必要がありません。
・'w'では、毎回上書きされて、結局1行しか記録されません。
ご回答ありがとうございます!
すいません。なんか完全に勘違いしてました。
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;
/
てな感じでよろしいんでしょうか?
明日動作確認してみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) VBA This Workbookモジュールを別ファイルにコピーする方法 1 2022/09/14 01:51
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- UNIX・Linux Linuxの実行結果を修正したいです。 6 2022/11/22 12:57
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- 画像編集・動画編集・音楽編集 DVD Styler トラブル解決方法 6 2022/10/29 16:00
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Ruby 教えてください 2 2023/01/04 17:50
- その他(プログラミング・Web制作) セレクトボックスで選択された値をコントローラーで使用したい 2 2022/07/26 16:41
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
oracleで 10,20, 30, というデ...
-
ノートパソコンのマイク音量が...
-
データベースのカラムの型がCHA...
-
バッチファイルで複数フォルダ...
-
sqlで質問です。 Aテーブルは店...
-
SQLの中上級者へのレベルアップ...
-
SELECTによる表の変換方法を教...
-
開発対象となるアプリケーショ...
-
質問です。 下記のテーブルとデ...
-
Oracleですがsqlで質問です。 ...
-
sqlで質問です。 Aテーブルの登...
-
sqlで質問です。 Aテーブルの情...
-
SQLの書き方について
-
SQLについて教えて下さい。 主...
-
sqlで質問です。 idを元にidに...
-
索引作成について
-
googleプレイの履歴で取得とイ...
-
sql(oracle)で質問です。 テ...
-
オラクルゴールドについて
-
sqlのupdate文で質問です。 テ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DELETE文でFROM句を省略した場合
-
他の処理でselectさせないよう...
-
RDBのテーブル種類の違い
-
同じSELECT文同士でのデ...
-
object browser で処理を中断す...
-
[性能改善]AccessのDBに大量の...
-
accessでイベントを中止するよ...
-
統計情報の取得=コミットですか?
-
チューニング対象のSQLの見つけ...
-
PL/SQLの平行処理について
-
処理速度の見積もり時間について。
-
Truncate以外で高速にテーブル...
-
ActiveX DLLでのオラクルのトラ...
-
stored procedureの引数について
-
トリガーにてUTL_FILEパッケー...
-
Access2013で操作ログを残した...
-
Oracleの欠点
-
Oracleから見たOracleの優位性(...
-
年度毎にシーケンスの初期化?
-
処理が終わったり終わらなかっ...
おすすめ情報