在PLSQL中批量插入而不是循环?

Har*_*ris 1 plsql bulkinsert cursor oracle11g

我试图用批量插入或其他更有效的方法解决这段代码,但我没有想法.你会怎么解决这个问题.而不是循环这么多次我想在几次调用中更有效.请告诉我你会怎么做?尽可能使用代码!感谢名单

LOOP
-- Fetch a row
IF DBMS_SQL.FETCH_ROWS(cursor_handle) > 0 THEN
    DBMS_SQL.column_value(cursor_handle, 9, cont_id); 
    DBMS_SQL.COLUMN_VALUE(cursor_handle, 3, proj_nr);  
    HTP.BOLD('ContractID: ' || cont_id || ' ProjectNR: ' ||  proj_nr);
    HTP.BR;
ELSE
    EXIT;
END IF;

-- delete the old list before saving a new one
IF sek_nr = 1 THEN
  EXECUTE IMMEDIATE 'DELETE FROM W_Contracts WHERE user_id = :n' USING CURRENTUSER;
END IF;

EXECUTE IMMEDIATE 'Insert into W_Contracts values(''' || currentUser || ''', '
                   || sek_nr || ', sysdate, ' || cont_id || ', '''
                   || proj_nr || ''')';

sek_nr := sek_nr + 1;
END LOOP;
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 8

首先,我不清楚为什么你使用动态SQL而不是静态SQL.

IF sek_nr = 1 
THEN
  DELETE FROM w_contracts
   WHERE user_id = currentUser;
END IF;

INSERT INTO w_contracts( <<list of columns>> )
  VALUES( currentUser, sek_nr, sysdate, cont_id, proj_nr );
Run Code Online (Sandbox Code Playgroud)

接下来,对我来说,为什么你可能会做一个DELETE然后INSERT如果SEK_NR是1 那么对我来说并不明显UPDATE.在这种情况下做一个可能会更有效率.一旦你做了一个UPDATE和一个INSERT,你可以简化为一个单一的MERGE声明.

接下来,如果您使用的DEFINE_ARRAY方法DBMS_SQL,你可以从你的光标做数据的批量读取操作.当然,如果没有看到您的游标定义,我会怀疑它是否也在不必要地使用动态SQL,并且您可以使用更简单的方法.