質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

5367閲覧

テーブルに1レコードインサート処理を実施するとエラー発生

raccoondog

総合スコア77

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/11/08 08:04

編集2018/11/16 00:46

oracledatabae12cのテーブルへ、1レコードをインサートさせて事前に作成したトリガーが正常に動作するか検証しようとしたところ
インサートが出来ず、エラーが発生しました。
インサート処理で失敗し、かつトリガーのエラーも出力されていました。

原因調査中となります。

※インサート処理

SQL> desc INPUT_TEST 名前 NULL? 型 ----------------------------------------- -------- ---------------------- ID NOT NULL NUMBER(8) NUM NUMBER(12,2) STR CHAR(8) VARSTR VARCHAR2(8) DT DATE TIME0 TIMESTAMP(0) TIME6 TIMESTAMP(6) TIME9 TIMESTAMP(9) SQL> SQL> select count(*) from INPUT_TEST; COUNT(*) ---------- 255 SQL> insert into INPUT_TEST ( 2 ID,NUM,STR 3 ) values ( 4 '256', '2849', 'chr1' 5 ); insert into INPUT_TEST ( * 行1でエラーが発生しました。: ORA-27486: 権限が不足しています ORA-06512: "SYS.DBMS_ISCHED", 行175 ORA-06512: "SYS.DBMS_SCHEDULER", 行288 ORA-06512: "SYSTEM.EMBULK_TR", 行12 ORA-04088: トリガー'SYSTEM.EMBULK_TR'の実行中にエラーが発生しました

※トリガーを使わずに実行した結果

SQL> begin 2 IF INSERTING THEN 3 dbms_output.put_line('-------------------------'); 4 dbms_output.put_line('OracleDB to BigQuery Bulk Insert Start'); 5 DBMS_SCHEDULER.CREATE_JOB ( 6 JOB_NAME => 'EmbulkTest', 7 JOB_TYPE => 'EXECUTABLE', 8 JOB_ACTION => 'C:\Users\yazaki\Desktop\embulk\oracle_to_bigquery.bat'); 9 DBMS_SCHEDULER.ENABLE('EmbulkTest'); 10 dbms_output.put_line('OracleDB to BigQuery Bulk Insert End'); 11 dbms_output.put_line('-------------------------'); 12 END IF; 13 end; 14 / PL/SQLプロシージャが正常に完了しました。 SQL> SQL> SQL> SQL> insert into INPUT_TEST (ID,NUM,STR) values ('312', '2849', 'chr1'); 1行が作成されました。 SQL> SQL> commit; コミットが完了しました。 SQL> SQL> select owner,job_name,state from dba_scheduler_jobs where job_name = 'EmbulkTest'; レコードが選択されませんでした。 SQL>

※再トライ

SQL> create or replace trigger embulk_tr 2 3 after insert on INPUT_TEST for each row 4 5 DECLARE pragma autonomous_transaction; 6 7 begin 8 IF INSERTING THEN 9 10 dbms_output.put_line('-------------------------'); 11 dbms_output.put_line('OracleDB to BigQuery Bulk Insert Start'); 12 13 DBMS_SCHEDULER.CREATE_JOB ( 14 JOB_NAME => 'EmbulkTest', 15 JOB_TYPE => 'EXECUTABLE', 16 JOB_ACTION => 'C:\WINDOWS\system32\cmd.exe /c C:\Users\yazaki\Desktop\embulk\oracle_to_bigquery.bat', 17 start_date => TO_DATE('2018/11/13 00:00:00','yyyy/mm/dd hh24:mi:ss'), 18 end_date => TO_DATE('2999/12/31 00:00:00','yyyy/mm/dd hh24:mi:ss'), 19 repeat_interval => 'FREQ=SECONDLY;interval=1', 20 auto_drop => TRUE, 21 enabled => TRUE 22 ); 23 24 25 dbms_output.put_line('OracleDB to BigQuery Bulk Insert End'); 26 dbms_output.put_line('-------------------------'); 27 28 END IF; 29 end; 30 / トリガーが作成されました。 SQL> select owner,job_name,state from dba_scheduler_jobs where job_name = 'EMBULKTEST'; OWNER JOB_NAME STATE ------------------------------ ------------------------------ ------------------------------ SYSTEM EMBULKTEST SCHEDULED SQL> SQL> select trigger_name,status,triggering_event,action_type,TRIGGER_BODY from dba_triggers where trigger_name = 'EMBULK_TR'; TRIGGER_NAME STATUS TRIGGERING_EVEN ACTION_TYPE TRIGGER_BODY --------------- --------------- --------------- --------------- -------------------------------------------------- EMBULK_TR ENABLED INSERT PL/SQL DECLARE pragma autonomous_transaction; begin IF INSERTING THEN dbms_output.put

※2回目のインサートでエラー

SQL> insert into INPUT_TEST (ID,NUM,STR) values ('333', '2849', 'chr1'); insert into INPUT_TEST (ID,NUM,STR) values ('333', '2849', 'chr1') * 行1でエラーが発生しました。: ORA-27477: "SYSTEM"."EMBULKTEST"はすでに存在します ORA-06512: "SYS.DBMS_ISCHED", 行175 ORA-06512: "SYS.DBMS_SCHEDULER", 行288 ORA-06512: "SYSTEM.EMBULK_TR", 行9 ORA-04088: トリガー'SYSTEM.EMBULK_TR'の実行中にエラーが発生しました

※ジョブ作成時に引数を与えてリトライ

create or replace trigger embulk_tr after insert on INPUT_TEST for each row DECLARE pragma autonomous_transaction; begin dbms_output.put_line('-------------------------'); dbms_output.put_line('OracleDB to BigQuery Bulk Insert Start'); IF INSERTING THEN DBMS_SCHEDULER.CREATE_JOB ( JOB_NAME => 'Embulk_Test', JOB_TYPE => 'EXECUTABLE', JOB_ACTION => 'C:\WINDOWS\system32\cmd.exe', number_of_arguments => 3, start_date => TO_DATE('2018/11/13 00:00:00','yyyy/mm/dd hh24:mi:ss'), end_date => TO_DATE('2999/12/31 00:00:00','yyyy/mm/dd hh24:mi:ss'), repeat_interval => 'FREQ=SECONDLY;interval=1', auto_drop => FALSE ); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('Embulk_Test',1, '/q'); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('Embulk_Test',2, '/c'); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('Embulk_Test',3, 'C:\Users\yazaki\Desktop\embulk\test.bat'); DBMS_SCHEDULER.ENABLE('Embulk_Test'); END IF; dbms_output.put_line('OracleDB to BigQuery Bulk Insert End'); dbms_output.put_line('-------------------------'); end; / トリガーが作成されました。 ※アラートログ 2018-11-15T10:59:32.125731+09:00 Errors in file C:\USERS\YAZAKI\DESKTOP\EMBULKDB\diag\rdbms\orcl\orcl\trace\orcl_j001_4908.trc: ORA-12012: ジョブ"SYSTEM"."EMBULK_TEST"の自動実行エラーが発生しました ORA-27369: タイプEXECUTABLEのジョブが、次の終了コードで失敗しました: 1 A N Z X ? ? B

※2018/11/16トリガー文

create or replace trigger embulk_tr after insert on INPUT_TEST for each row DECLARE pragma autonomous_transaction; begin dbms_output.put_line('-------------------------'); dbms_output.put_line('OracleDB to BigQuery Bulk Insert Start'); IF INSERTING THEN DBMS_SCHEDULER.CREATE_JOB ( JOB_NAME => 'Embulk_Test', JOB_TYPE => 'EXECUTABLE', -- JOB_ACTION => '"C:\WINDOWS\system32\cmd.exe" /q /c "C:\Users\yazaki\Desktop\embulk\test.bat"', JOB_ACTION => 'C:\WINDOWS\system32\cmd.exe', number_of_arguments => 3, start_date => TO_DATE('2018/11/13 00:00:00','yyyy/mm/dd hh24:mi:ss'), end_date => TO_DATE('2999/12/31 00:00:00','yyyy/mm/dd hh24:mi:ss'), repeat_interval => 'FREQ=SECONDLY;interval=300', auto_drop => FALSE ); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('Embulk_Test',1, '/q'); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('Embulk_Test',2, '/c'); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('Embulk_Test',3, 'C:\Users\yazaki\Desktop\embulk\test.bat'); DBMS_SCHEDULER.ENABLE('Embulk_Test'); -- DBMS_SCHEDULER.RUN_JOB ( -- JOB_NAME => 'Embulk_Test', -- USE_CURRENT_SESSION => FALSE -- ); END IF; dbms_output.put_line('OracleDB to BigQuery Bulk Insert End'); dbms_output.put_line('-------------------------'); end; /

※batファイル

dir >> C:\Users\yazaki\Desktop\embulk\test.txt

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2018/11/08 09:49

SQLで使われているテーブルはCREATE されていなければなりません。DESCではなく、CREATE TABLE で載せる習慣を身に着けては?
raccoondog

2018/11/08 23:53

テーブルは作成済みとなります。sqlで使われるテーブルは実行のたびに再作成する必要があるのでしょうか?
Orlofsky

2018/11/09 08:15

DROPしない限りテーブルは残っています。テーブルが存在するかはDESCで確認できます。現象を再現できるかなるべく動作確認してから回答したいから CREATE TABLE を載せていただければ、ということで無理強いはしません。なお、SQLでは数値はシングルクォートで囲みません。データ型の扱いが雑な人が書いたコードは極端にパフォーマンスが悪くなることがありますからご注意を。
raccoondog

2018/11/12 07:57

ご指摘ありがとうございます。
guest

回答3

0

markdown を使いたいのでこちらに移動しました。

ORA-12012: ジョブ"SYSTEM"."EMBULK_TEST"の自動実行エラーが発生しました

5 DBMS_SCHEDULER.CREATE_JOB (
6 JOB_NAME => 'EmbulkTest',
とJOB_NAME に _ が抜けています。

DBMS_SCHEDULER.CREATE_JOBしたら、どこで実行するかはともかくDBMS_SCHEDULER.DROP_JOB が必要では?

ORA-27369: タイプEXECUTABLEのジョブが、次の終了コードで失敗しました: 1 A N Z X ? ? B

本当に 1 A N Z X ? ? B って表示されましたか?Oracleのエラーメッセージで英数字がマルチバイト文字で空白を1桁ずつ入れて表示された経験がないので気になります。

8 JOB_ACTION => 'C:\Users\yazaki\Desktop\embulk\oracle_to_bigquery.bat');

この bat の内容は?
別のOracle SESSIONでINSERT後の値を使っていますか?

SQLでは数値はシングルクォートで囲みません。INSERT文は直しては?

投稿2018/11/15 10:34

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccoondog

2018/11/16 00:43

ご回答有難うございます。 >DBMS_SCHEDULER.CREATE_JOBしたら、どこで実行するかはともかくDBMS_SCHEDULER.DROP_JOB が必要では? ⇒トリガー再作成時は必ずdropするようにしております。 >本当に 1 A N Z X ? ? B って表示されましたか?Oracleのエラーメッセージで英数字がマルチバイト文字で空白を1桁ずつ入れて表示された経験がないので気になります。 ⇒アラートログファイルに出力されておりました。 >この bat の内容は? >別のOracle SESSIONでINSERT後の値を使っていますか? 現状使用している最新のトリガー文を質問内容に記載させて頂きます。 別のセッションではinsert後の値は使っていない状況となります。
Orlofsky

2018/11/16 04:35

トリガーを使わないで実行したらどうなりますか? >C:\Users\yazaki\Desktop\embulk\test.txt の内容は? 問題の解決を長引かせないで済む質問の仕方を考えては? サポート契約して直接オラクル・サポートに問合せた方が解決が早そうです。
guest

0

メッセージにも出てますが、Insertを実行したユーザに、トリガーの中で行われているDBMS_SCHEDULER.CREATE_JOBの権限が無かったのでは?
Insert文実行時のユーザの権限を確認してみてはいかがでしょうか。

投稿2018/11/08 08:32

shun_kuwa

総合スコア187

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccoondog

2018/11/08 08:58

ご回答ありがとうございます。権限付与して該当のエラーは出力されなくなりました。再実行時にINPUT_TESTテーブルが既に存在する。とのエラーが出てしまいました。こちらの原因調査中となります。詳細は質問内容に追記させて頂きます。
shun_kuwa

2018/11/08 10:09

INPUT_TESTテーブルではなく、'embulk_test'という名前のジョブが既に存在すると言われています。 このジョブはトリガーで作成された後削除されていないようなので、2回目以降の実行で必ず既存ジョブと名前が重複しますね。
raccoondog

2018/11/09 00:40

ご回答ありがとうございます。ジョブ削除後に、トリガーを再作成し、テーブルへのインサート処理も正常に実行されました。トリガーが動作するかと思ったのですが、ジョブ自体が見つからず、トリガーが正常動作していないように見受けられます。何が起きているのか調査したく、トリガーの動作状況確認方法を調査しております。 詳細につきましては質問内容を更新しております。
shun_kuwa

2018/11/09 01:38

Triggerの内容は変えていないんですよね? でしたら、今の状態でInsert文を再度実行してみてはいかがでしょうか。 トリガーが動いていればなんらかエラーが出るはずですし、Insert文がすんなり通るということはトリガーが動いていないということだと思いますよ。
raccoondog

2018/11/09 04:32

トリガーは正常に有効化されているように見受けられます。(質問内容に追記しました。)エラーも画面上には出力されておらず、何か特定のログファイルにエラーを出力されているか調査中となります。
raccoondog

2018/11/12 04:57

トリガー作成時のコンパイルエラーが出力されていることを確認しました。質問内容を更新させて頂きます。
shun_kuwa

2018/11/12 05:20

トリガー作成時のコンパイルエラーとは、質問中のどれのことでしょうか。
raccoondog

2018/11/12 05:31

すみません。少しコーディングを変えてみてミスがありましたので、修正し解決いたしました。 問題のトリガーが動作しない事象は続いております。 トリガーの中で、ジョブ作成しているのですが、ジョブが作成できていないように見受けられます。 トリガー作成は成功しているのに、ジョブは作成されていない。 このような事象があるのか、調査中となります。
raccoondog

2018/11/12 05:48

declare pragma autonomous_transaction; 自律型のオプションをはずしたら、トリガーが動作いたしました。 テストで1レコードインサートすると以下のエラーが出力されております。※質問内容に記載
raccoondog

2018/11/12 07:58

インサート文を実行して、commit前にトリガーが動いていました。 行トリガーで、after insertを指定しているのですが動いてしまいます。
Orlofsky

2018/11/12 09:13 編集

自律型トランザクションは(今回は)TRIGGERの中でCOMMITします。
raccoondog

2018/11/12 12:01

ご回答有難うございます。 現在、自律型トランザクションのパラメータははずして、検証中となります。 insert処理をcommitするまえにトリガーが動いてしまいます。
Orlofsky

2018/11/13 03:38

TRIGGERを使わずに、DBMS_SCHEDULER.CREATE_JOB と DBMS_SCHEDULER.ENABLE を 1行INSERT & COMMIT の次に実行したらどうなりますか?
raccoondog

2018/11/13 04:37

トリガーを使わずに実行したところ、インサート処理は正常に実行されました。windows上にあるバッチファイルは実行されませんでした。※詳細ログは質問内容を更新させて頂きました。
raccoondog

2018/11/13 08:18

トリガーに再度、自律型トランザクションを追加したところ トリガー作成後にジョブが生成されました。 しかし、インサート処理をしてコミットしても windowsバッチファイルは動かず 何も実行されていないように見受けられる状況となります。 詳細は、質問内容を更新
Orlofsky

2018/11/14 01:31

TRIGGERを使わずにやってみては? なお、STORED PROCEDUREでも自律型トランザクションは使えます。
raccoondog

2018/11/14 01:51

ご回答有難うございます。チーム内で検討させて頂きます。
raccoondog

2018/11/15 02:13

業務ロジックの仕様で、トリガーを使いたく引き続き検証しております。 トリガーの中でジョブ作成時に引数を与えてリトライしたのですが、insert⇒commitしてもwindowsコマンドは実行されず、oracleのアラートログにエラーが出力されます。 プログラムが正常に起動できていないように見受けられ、調査中となります。 詳細は、質問内容を更新しました。
Orlofsky

2018/11/15 07:56

アラートログのエラーの内容は?
raccoondog

2018/11/15 08:01

質問内容の最下部に記載しております。 念のため、こちらにも記載させて頂きます。 ※アラートログ 2018-11-15T10:59:32.125731+09:00 Errors in file C:\USERS\YAZAKI\DESKTOP\EMBULKDB\diag\rdbms\orcl\orcl\trace\orcl_j001_4908.trc: ORA-12012: ジョブ"SYSTEM"."EMBULK_TEST"の自動実行エラーが発生しました ORA-27369: タイプEXECUTABLEのジョブが、次の終了コードで失敗しました: 1 A N Z X ? ? B
guest

0

自己解決

ご協力頂きまして、有難うございました。

oracle側のextjobのファイル権限をoracle:dbaに
external.oraファイルの権限をoracle:dbaに、且つ、run_userをoracle、run_groupをdbaに設定後

正常に動作しました。

投稿2018/11/20 01:02

raccoondog

総合スコア77

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問