这是我的PLSQL代码:
declare
headerStr varchar2(1000):='C1~C2~C3~C5~C6~C7~C8~C9~C10~C11~C12~C16~C17~C18~C19~RN';
mainValStr varchar2(32000):='1327~C010802~9958756666~05:06AM~NO~DISPOSAL~NDL~4~P32~HELLO~U~28-OCT-2017~28-OCT-2017~Reject~C010741~1;1328~C010802~9958756666~06:07AM~MH~DROP~NDL~1~P32~~U~28-OCT-2017~28-OCT-2017~Reject~C010741~2;1329~C010802~9999600785~01:08AM~BV~DROP~NDL~2~P32~MDFG~U~28-OCT-2017~28-OCT-2017~Reject~C010741~3';
valStr varchar2(4000);
headerCur sys_refcursor;
mainValCur sys_refcursor;
valCur sys_refcursor;
header varchar2(1000);
val varchar2(1000);
iterator number:=1000;
strIdx number;
strLen number;
idx number;
TYPE T_APPROVAL_RECORD IS TABLE OF VARCHAR2(4000) INDEX BY VARCHAR2(1000);
headerTable T_APPROVAL_RECORD;
cnt number;
begin
open headerCur for select * from table(split_str(headerStr,'~'));
open mainValCur for select * from table(split_str(mainValStr,';'));
loop
fetch mainValCur into valStr;
exit when mainValCur%notfound;
insert into header_test values(cnt, valStr); -- for testing purpose
open valCur for select * from table(split_str(valStr,'~'));
loop
fetch valCur into val;
fetch headerCur into header;
exit when valCur%notfound;
exit when headerCur%notfound;
insert into header_test values(header, val);
headerTable(header):= val;
end loop;
idx := headerTable.FIRST; -- Get first element of array
WHILE idx IS NOT NULL LOOP
insert into header_test values (idx, headerTable(idx));
idx := headerTable.NEXT(idx); -- Get next element of array
END LOOP;
headerTable.delete;
end loop;
commit;
end;
c1 c2 ..... c19是列名,RN是rownumber,
每个列的数据将在mainValString中分隔;
当我尝试访问集合“headerTable”时,为什么我会收到ORA-14551?
请帮忙。
答案 0 :(得分:0)
这条线存在问题。
idx := headerTable.FIRST;
headertable
的索引属于VARCHAR2
,而idx
的定义为NUMBER
。
将idx
声明为VARCHAR2(1000)
,它应该有效。
话虽如此,ORA-14551 - Cannot perform DML ...
与此错误无关。我不清楚为什么你会遇到这个错误。
答案 1 :(得分:0)
哦但确实如此:
EXCEPTION WHEN OTHERS THEN
v_msg:=sqlcode||sqlerrm;
insert into err_data_transfer values('SPLIT_STR',v_msg,sysdate,null);
它可能只是在异常期间,但在select语句中它仍然是DML。您可以创建另一个过程AUTONOMOUS_TRANSACTION
来创建错误日志。此外,您应该重新加注或raise_application_error
之后。如果不是,您的程序将继续,就好像没有发生错误;这导致更多的问题,为什么你的主要过程不起作用(包括运行完成但做错事)。