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

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

ただいまの
回答率

90.48%

  • SQL

    3080questions

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

  • Oracle Database

    147questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 499

raccoondog

score 13

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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2018/11/08 18:49

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

    キャンセル

  • raccoondog

    2018/11/09 08:53

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

    キャンセル

  • Orlofsky

    2018/11/09 17:15

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

    キャンセル

  • raccoondog

    2018/11/12 16:57

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

    キャンセル

回答 3

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/08 17:58

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

    キャンセル

  • 2018/11/08 19:09

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

    キャンセル

  • 2018/11/09 09:40

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

    キャンセル

  • 2018/11/09 10:38

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

    キャンセル

  • 2018/11/09 13:32

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

    キャンセル

  • 2018/11/12 13:57

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

    キャンセル

  • 2018/11/12 14:20

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

    キャンセル

  • 2018/11/12 14:31

    すみません。少しコーディングを変えてみてミスがありましたので、修正し解決いたしました。

    問題のトリガーが動作しない事象は続いております。

    トリガーの中で、ジョブ作成しているのですが、ジョブが作成できていないように見受けられます。

    トリガー作成は成功しているのに、ジョブは作成されていない。

    このような事象があるのか、調査中となります。

    キャンセル

  • 2018/11/12 14:48

    declare
    pragma autonomous_transaction;

    自律型のオプションをはずしたら、トリガーが動作いたしました。

    テストで1レコードインサートすると以下のエラーが出力されております。※質問内容に記載

    キャンセル

  • 2018/11/12 16:58

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

    キャンセル

  • 2018/11/12 18:11 編集

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

    キャンセル

  • 2018/11/12 21:01

    ご回答有難うございます。
    現在、自律型トランザクションのパラメータははずして、検証中となります。

    insert処理をcommitするまえにトリガーが動いてしまいます。

    キャンセル

  • 2018/11/13 12:38

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

    キャンセル

  • 2018/11/13 13:37

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

    キャンセル

  • 2018/11/13 17:18

    トリガーに再度、自律型トランザクションを追加したところ
    トリガー作成後にジョブが生成されました。

    しかし、インサート処理をしてコミットしても
    windowsバッチファイルは動かず
    何も実行されていないように見受けられる状況となります。

    詳細は、質問内容を更新

    キャンセル

  • 2018/11/14 10:31

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

    キャンセル

  • 2018/11/14 10:51

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

    キャンセル

  • 2018/11/15 11:13

    業務ロジックの仕様で、トリガーを使いたく引き続き検証しております。
    トリガーの中でジョブ作成時に引数を与えてリトライしたのですが、insert⇒commitしてもwindowsコマンドは実行されず、oracleのアラートログにエラーが出力されます。

    プログラムが正常に起動できていないように見受けられ、調査中となります。
    詳細は、質問内容を更新しました。

    キャンセル

  • 2018/11/15 16:56

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

    キャンセル

  • 2018/11/15 17: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

    キャンセル

+1

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/16 09:43

    ご回答有難うございます。

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

    ⇒トリガー再作成時は必ずdropするようにしております。

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

    ⇒アラートログファイルに出力されておりました。

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

    現状使用している最新のトリガー文を質問内容に記載させて頂きます。
    別のセッションではinsert後の値は使っていない状況となります。

    キャンセル

  • 2018/11/16 13:35

    トリガーを使わないで実行したらどうなりますか?

    >C:\Users\yazaki\Desktop\embulk\test.txt
    の内容は?

    問題の解決を長引かせないで済む質問の仕方を考えては?
    サポート契約して直接オラクル・サポートに問合せた方が解決が早そうです。

    キャンセル

check解決した方法

0

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

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

正常に動作しました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • SQL

    3080questions

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

  • Oracle Database

    147questions

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