无法在查询中执行DML操作?在尝试从集合中获取数据时

时间:2017-12-01 09:51:44

标签: plsql

enter image description here

这是我的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?

请帮忙。

2 个答案:

答案 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之后。如果不是,您的程序将继续,就好像没有发生错误;这导致更多的问题,为什么你的主要过程不起作用(包括运行完成但做错事)。