2017-04-11 16 views
-1
CREATE OR REPLACE TRIGGER ABC_TEST_TRIG 
BEFORE UPDATE ON ABC_TEST 
FOR EACH ROW 
DECLARE 
NAME_CH VARCHAR2(25); 
NUM_CH NUMBER(5); 
BEGIN 
--SELECT NAME,NUM INTO NAME_CH, NUM_CH FROM ABC_TEST WHERE NAME ='KUNAL'; 

    INSERT INTO ABC_NEW (NEW_NAME,OLD_NAME,NEW_NUM,OLD_NUM) 
    VALUES(':NEW.NEW_NAME',':OLD.NAME',':NEW.NEW_NUM',':OLD.NUM') ; 
END; 
/

UPDATE ABC_TEST SET NAME ='KUSH' , NUM=90 WHERE NAME = 'KUNAL'; 

エラー:トリガーはコンパイルされますが、発射にORA-01722エラーが発生します

UPDATE ABC_TEST SET NAME ='KUSH' , NUM=90 WHERE NAME = 'KUNAL' 
Error report - 
SQL Error: ORA-01722: invalid number 
ORA-06512: at "APPSREAD.ABC_TEST_TRIG", line 7 
ORA-04088: error during execution of trigger 'APPSREAD.ABC_TEST_TRIG' 
01722. 00000 - "invalid number" 
*Cause: The specified number was invalid. 
*Action: Specify a valid number. 

答えて

1

あなたの挿入は、単一の前後に引用符のすべての値を持っています。 ':NEW.NEW_NAME'は文字列リテラルです。数字列に文字列リテラルを挿入しようとすると、暗黙的に変換しようとしますが、この場合は不可能です。古いものと新しいものが何であっても、おそらく実際には数字であるので、:OLD.NUMは数字です。文字列リテラル':OLD.NUM'は数字ではありません。

INSERT INTO ABC_NEW (NEW_NAME,OLD_NAME,NEW_NUM,OLD_NUM) 
    VALUES(:NEW.NAME,:OLD.NAME,:NEW.NUM,:OLD.NUM) ; 
:あなたの列に NEW_プレフィックスなしで、

INSERT INTO ABC_NEW (NEW_NAME,OLD_NAME,NEW_NUM,OLD_NUM) 
    VALUES(:NEW.NEW_NAME,:OLD.NAME,:NEW.NEW_NUM,:OLD.NUM) ; 

またはおそらく可能性が高い:あなたは、単一引用符を削除する必要が

関連する問題