提高插入光标的性能?

时间:2012-01-22 17:04:37

标签: plsql insert cursor

我想问你如何在这段代码中提高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;

3 个答案:

答案 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对你没有帮助。

无论如何,由于您未能提供我们实际需要的其他信息,请让我为您拼出:

  • SELECT语句是否始终具有相同表名的相同列名,或者用户是否可以更改这两个名称?
  • 你会对第三和第九列感兴趣吗?
  • W_STMT字符串是如何组合的?你对它的预测有多少控制?