我正在尝试使用批量插入或其他更有效的方法解决这段代码但我没有想法。你会怎么解决这个问题。而不是循环这么多次我想在几次调用中更有效。请告诉我你会怎么做?尽可能使用代码!感谢名单
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;
答案 0 :(得分: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 );
接下来,对于我来说,如果DELETE
为1,为什么你可能会INSERT
然后SEK_NR
,这对我来说并不明显。执行{可能更有效率{ {1}}在这种情况下。在您执行UPDATE
和UPDATE
后,您可以将其简化为单个INSERT
语句。
接下来,如果您使用MERGE
中的DEFINE_ARRAY
method,则可以从光标批量提取数据。当然,如果没有看到您的游标定义,我会怀疑它是否也在不必要地使用动态SQL,并且您可以使用更简单的方法。