我想问你如何在这段代码中提高Insert游标的性能? 我需要使用动态plsql来获取数据,但不知道如何以最佳方式改进INSERT。像批量插入可能吗? 如果可能,请通过代码示例告诉我。
//这就是我使用cur_handle的方式:
cur_HANDLE integer;
cur_HANDLE := dbms_sql.open_cursor;
DBMS_SQL.PARSE(cur_HANDLE, W_STMT, DBMS_SQL.NATIVE);
DBMS_SQL.DESCRIBE_COLUMNS2(cur_HANDLE, W_NO_OF_COLS, W_DESC_TAB);
LOOP
-- Fetch a row
IF DBMS_SQL.FETCH_ROWS(cur_HANDLE) > 0 THEN
DBMS_SQL.column_value(cur_HANDLE, 9, cont_ID);
DBMS_SQL.COLUMN_VALUE(cur_HANDLE, 3, proj_NR);
ELSE
EXIT;
END IF;
Insert into w_Contracts values(counter, cont_ID, proj_NR);
counter := counter + 1;
END LOOP;
答案 0 :(得分:1)
您应尽可能在集合中执行数据库操作,而不是逐行插入。你没有告诉我们CUR_HANDLE
是什么,所以我不能真正改写它,但你应该做的事情如下:
INSERT INTO w_contracts
SELECT ROWNUM, cont_id, proj_nr
FROM ( ... some table or joined tables or whatever... )
虽然如果您的第一个值存在主键,那么从序列中分配它可能会更好。
答案 1 :(得分:1)
解决方案1)您可以在循环内部填充PL / SQL数组,然后在循环之后使用以下步骤插入整个数组:
FORALL i in contracts_tab.first .. contracts_tab.last
INSERT INTO w_contracts VALUES contracts_tab(i);
解决方案2)如果v_stmt包含有效的SQL语句,您可以使用
直接将数据插入表中EXECUTE IMMEDIATE 'INSERT INTO w_contracts (counter, cont_id, proj_nr)
SELECT rownum, 9, 3 FROM ('||v_stmt||')';
答案 2 :(得分:0)
“select语句是从网站组装的,如果用户选择,则为ex 包括更详细的搜索,然后更改选择语句和 最终结果看起来不同。整个应用程序是一个Web 网站建立在dinamic plsql代码上。“
这是一个危险的命题,因为它会打开您的数据库以进行SQL注入。这是Bad People破坏您的参数以扩展他们可以检索的数据或升级权限的情况。至少,您需要使用DBMS_ASSERT来验证用户输入。 Find out more
当然,如果您允许用户传递整个SQL字符串(您尚未提供有关W_STMT
的构造的任何信息),则所有投注均已关闭。 DBMS_ASSERT对你没有帮助。
无论如何,由于您未能提供我们实际需要的其他信息,请让我为您拼出:
W_STMT
字符串是如何组合的?你对它的预测有多少控制?