2013-04-04 131 views
0

我有一個編譯好的觸發器,但拋出了ORA12704字符不匹配錯誤。 這是引發錯誤Oracle觸發器中的ORA12704錯誤

Begin 
    if :new.ADD_TEXT = '{8A9AFF65-9BD8-4B2A-8686-5279CC34F24B}' and 
     :new.MORE_TEXT is null then 
     :new.MORE_TEXT := substr(:new.RES_TXT, instr(:new.RES_TXT, '.',-1)+1, 10); 
+0

請張貼的DDL表,是一列NVARCHAR2/NCLOB? – DazzaL 2013-04-04 15:30:13

+0

ADD_TEXT是VARCHAR2 38 MORE_Text是NVARCHAR2 500 RES_TXT是NVARCHAR2 500 – 2013-04-04 15:38:57

+0

不會改變INSTR到'INSTR(: '' new.RES_TXT,N, - 1)+1,10)'任何區別還什麼確切的版本的oracle,因爲我不能在這裏複製這個問題。你是否有一個帶有導致失敗的列的值的示例插入(觸發器只包含上面的行) – DazzaL 2013-04-04 15:53:01

回答

0

嘗試改變線路

:new.MORE_TEXT := substr(:new.RES_TXT, instr(:new.RES_TXT, '.',-1)+1, 10); 

:new.MORE_TEXT := substr(:new.RES_TXT, instr(:new.RES_TXT, n'.',-1)+1, 10); 

即必須在INSTR函數調用相匹配的第一個和第二個參數數據類型。儘管如此,我仍然無法在10.2.0.4上覆制該問題,即使該參數爲'.'也是如此。

.e.g如果你用你的插入值在你的機器上運行這個煮式測試用例,它會失敗嗎?

drop table tester; 
create table tester 
(
ADD_TEXT VARCHAR2 (38), 
MORE_Text NVARCHAR2(500), 
RES_TXT NVARCHAR2(500) 
); 

create trigger tester_trig 
before insert on tester 
for each row 
declare 
begin 
    if :new.ADD_TEXT = '{8A9AFF65-9BD8-4B2A-8686-5279CC34F24B}' and 
     :new.MORE_TEXT is null then 
     :new.MORE_TEXT := substr(:new.RES_TXT, instr(:new.RES_TXT, '.',-1)+1, 10); 
    end if; 

end; 
/

insert into tester values ('{8A9AFF65-9BD8-4B2A-8686-5279CC34F24B}', '', 'your.value'); 
select * from tester; 

編輯:

按您的新的觸發:

SQL> CREATE OR REPLACE TRIGGER test_trigger_001 
    2 Before Insert or update ON tester 
    3 for each row 
    4 declare 
    5 v1_ext varchar2(10); 
    6 Begin 
    7 if :new.ADD_TEXT = '{8A9AFF65-9BD8-4B2A-8686-5279CC34F24B}' 
    8  and :new.MORE_TEXT is null 
    9 then 
10  :new.MORE_TEXT := substr(:new.RES_TXT, instr(:new.RES_TXT, '.',-1)+1, 10); 
11  select Case :new.MORE_TEXT 
12  WHEN 'avi' THEN 'video/x-msvideo' 
13  WHEN 'doc' THEN 'application/msword' 
14  else 'application/unknown' 
15  end 
16  into :new.MORE_TEXT 
17  from dual; 
18 end if; 
19 v1_ext := null; 
20 END; 
21/

Warning: Trigger created with compilation errors. 

SQL> show errors 
Errors for TRIGGER TEST_TRIGGER_001: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
8/5  PL/SQL: SQL Statement ignored 
9/12  PL/SQL: ORA-12704: character set mismatch 

修復與n

SQL> CREATE OR REPLACE TRIGGER test_trigger_001 
    2 Before Insert or update ON tester 
    3 for each row 
    4 declare 
    5 v1_ext varchar2(10); 
    6 Begin 
    7 if :new.ADD_TEXT = '{8A9AFF65-9BD8-4B2A-8686-5279CC34F24B}' 
    8  and :new.MORE_TEXT is null 
    9 then 
10  :new.MORE_TEXT := substr(:new.RES_TXT, instr(:new.RES_TXT, n'.',-1)+1, 10); 
11  select Case :new.MORE_TEXT 
12  WHEN n'avi' THEN n'video/x-msvideo' 
13  WHEN n'doc' THEN n'application/msword' 
14  else n'application/unknown' 
15  end 
16  into :new.MORE_TEXT 
17  from dual; 
18 end if; 
19 v1_ext := null; 
20 END; 
21/

Trigger created. 

SQL> show errors 
No errors. 
SQL> insert into tester values ('{8A9AFF65-9BD8-4B2A-8686-5279CC34F24B}', '', 'foo.avi'); 

1 row created. 

SQL> select * from tester; 

ADD_TEXT 
-------------------------------------- 
MORE_TEXT 
-------------------------------------------------------------------------------- 
RES_TXT 
-------------------------------------------------------------------------------- 
{8A9AFF65-9BD8-4B2A-8686-5279CC34F24B} 
video/x-msvideo 
foo.avi 
+0

這有效,下一步是什麼。 CREATE OR REPLACE TRIGGER test_trigger_001 Before Insert or update ON tester for each row declare v1_ext varchar2(10); Begin if :new.ADD_TEXT = '{8A9AFF65-9BD8-4B2A-8686-5279CC34F24B}' and :new.MORE_TEXT is null then :new.MORE_TEXT := substr(:new.RES_TXT, instr(:new.RES_TXT, '.',-1)+1, 10); select Case :new.MORE_TEXT WHEN 'avi' THEN 'video/x-msvideo' WHEN 'doc' THEN 'application/msword' \t else 'application/unknown' end into :new.MORE_TEXT from dual; end if; v1_ext := null; END; 2013-04-04 17:36:30

+0

@ user1655869你看到你在混合NVARCHAR和varchar文字。所以在這裏做同樣的修復':new.MORE_TEXT當'avi''應該是':new.MORE_TEXT當與'doc','application/msword'和''application/unknown''應該都是相同的時候在他們身上有'n'操作符! – DazzaL 2013-04-04 18:35:43