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

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

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

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

SQL

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

解決済

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

raccoondog
raccoondog

総合スコア75

Oracle Database

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

SQL

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

3回答

0評価

0クリップ

3184閲覧

投稿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

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Oracle Database

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

SQL

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