嘗試改變線路
: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
請張貼的DDL表,是一列NVARCHAR2/NCLOB? – DazzaL 2013-04-04 15:30:13
ADD_TEXT是VARCHAR2 38 MORE_Text是NVARCHAR2 500 RES_TXT是NVARCHAR2 500 – 2013-04-04 15:38:57
不會改變INSTR到'INSTR(: '' new.RES_TXT,N, - 1)+1,10)'任何區別還什麼確切的版本的oracle,因爲我不能在這裏複製這個問題。你是否有一個帶有導致失敗的列的值的示例插入(觸發器只包含上面的行) – DazzaL 2013-04-04 15:53:01