挿入用にテーブルにトリガーを作成しようとしています。ここで作成スクリプトは次のとおりです。挿入用のトリガーを作成できないように見える - Oracle
CREATE OR REPLACE TRIGGER INTEG_QRY_NEW
AFTER INSERT
ON INTEG_LOG
FOR EACH ROW
DECLARE
VAR2 NUMBER(10);
LOG_TEXT1 VARCHAR2(1000);
RESULT1 VARCHAR2(1000);
QUERY_NUM1 VARCHAR2(1000);
QUERY_TIME1 VARCHAR2(1000);
LOG_INDEX1 NUMBER(10);
BEGIN
SELECT COUNT(*) INTO VAR2 FROM USER_TAB_COLS WHERE (COLUMN_NAME = 'RESULT' OR COLUMN_NAME = 'QUERY_NUM' OR COLUMN_NAME = 'DATE_TIME') AND TABLE_NAME = 'INTEG_LOG';
IF VAR2=0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE INTEG_LOG ADD RESULT VARCHAR2(50); ALTER TABLE INTEG_LOG ADD DATE_TIME DATE; ALTER TABLE INTEG_LOG ADD QUERY_NUM VARCHAR2(50);';
END IF;
LOG_TEXT1 := :NEW.LOG_TEXT;
QUERY_TIME1 := :NEW.QUERY_TIME;
LOG_INDEX1 := :NEW.LOG_INDEX;
IF QUERY_TIME1 = '' THEN
RESULT1 := '-1';
QUERY_NUM1 := '';
UPDATE INTEG_LOG
SET RESULT = RESULT1,
DATE_TIME = CURRENT_DATE,
QUERY_NUM = QUERY_NUM1
WHERE LOG_INDEX = LOG_INDEX1;
ELSE
RESULT1 := SUBSTR(LOG_TEXT1,(INSTR(LOG_TEXT1,'Result = ')+9),9);
QUERY_NUM1 := SUBSTR(SUBSTR(LOG_TEXT1,INSTR(LOG_TEXT1,'Q# ')+3,20),1,INSTR(SUBSTR(LOG_TEXT1,INSTR(LOG_TEXT1,'Q# ')+3,20),' '));
UPDATE INTEG_LOG
SET RESULT = RESULT1,
DATE_TIME = CURRENT_DATE,
QUERY_NUM = QUERY_NUM1
WHERE LOG_INDEX = LOG_INDEX1;
END IF;
END;
/
トリガが(アプリケーションから来ている)次の列のための定期的なインサートの世話をしている
:
LOG_DATEのNUMBER(10)、
LOG_TIME番号(10)、
LOG_TYPE番号(10)、
LOG _TEXT VARCHAR2(2000 BYTE)、
LOG_INDEX番号(10)、
QUERY_TIME VARCHAR2(8バイト)の
が存在するか否かを次の列のトリガチェックを(そうでない場合、それを)それらを追加します。 RESULT VARCHAR2(50 BYTE)、 DATE_TIMEのDATE、 QUERY_NUM VARCHAR2(50 BYTE)
- は、今では(LOG_TEXT列)文字列を取り、その結果の値とクエリ数を撤回された(後に来るもの'#Q')。
- 次に、同じ挿入方法を更新し、これらの値を新しい3列(result、date_timeおよびquery_num)に追加するだけです。私はテーブルに(INTEG_LOG)を挿入しようとしていたときに
トリガーが正常に作成されますんが、問題がある、私は次のエラーを取得する:
table string.string is mutating, trigger/function may not see it
Cause: A trigger (or a user defined plsql function that is referenced in this statement) attempted to look at (or modify) a table that was in the middle of being modified by the statement which fired it.
Action: Rewrite the trigger (or function) so it does not read that table.
これは構文エラーの可能性がありますか?助けてください。ありがとうございました。
そのテーブルで起動するトリガ内のテーブルに列を追加することはできません。 トリガー内のどのテーブルにも列を追加しないでください。私はそれが良いアイデアとなるユースケースを考えることはできません。 – Allan