Plsql 提高插入游标的性能?

Plsql 提高插入游标的性能?,plsql,insert,cursor,Plsql,Insert,Cursor,我想问一下,在这段代码中,如何提高插入游标的性能? 我需要使用动态plsql获取数据,但不知道如何以最佳方式改进插入。比如批量插入? 如果可能,请让我知道代码示例 //这是我如何使用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_HA

我想问一下,在这段代码中,如何提高插入游标的性能? 我需要使用动态plsql获取数据,但不知道如何以最佳方式改进插入。比如批量插入? 如果可能,请让我知道代码示例

//这是我如何使用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;

您应该尽可能在集合中执行数据库操作,而不是逐行插入。你没有告诉我们CUR_HANDLE是什么,所以我无法真正重写它,但你可能应该这样做:

INSERT INTO w_contracts
SELECT ROWNUM, cont_id, proj_nr
  FROM ( ... some table or joined tables or whatever... )

虽然如果您的第一个值是主键,则最好从序列中分配它。

解决方案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||')';
select语句是从网站组装而成的,例如用户选择 包含更详细的搜索,然后更改select语句并 最终结果看起来不一样。整个应用程序是一个web应用程序 基于dinamic plsql代码的站点构建

这是一个危险的提议,因为它会打开数据库进行SQL注入。在这种情况下,坏人会破坏您的参数,以扩展他们可以检索的数据或升级权限。至少您需要使用DBMS_ASSERT来验证用户输入

当然,如果您允许用户传递整个SQL字符串,而您没有提供任何有关W_STMT构造的信息,那么所有赌注都是无效的。DBMS_断言在这方面帮不了你

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

SELECT语句是否始终具有相同表名中的相同列名,或者用户是否可以更改这两个列名? 你会一直对第三和第九栏感兴趣吗? W_STMT串是如何组装的?你对它的投影有多大的控制?
很抱歉丢失了信息。下面是我如何使用cur\u句柄:cur\u handle integer;-声明cur\u HANDLE:=dbms\u sql.open\u游标;DBMS_SQL.PARSEcur_HANDLE,W_STMT,DBMS_SQL.NATIVE;DBMS_SQL.description_COLUMNS2cur_HANDLE,W_NO_OF_COLS,W_DESC_TAB;但是游标的select语句是什么?W_STMT是语句变量的名称。显然,但语句是什么?我没有表或联接表,我只想使用循环中的cont_ID和proj_NR,并使用大容量插入将其插入!在现有循环的内部?我担心这会使整个操作变慢,因为它会为它获取的每一行进行插入!为什么您认为必须为游标使用动态SQL?如果您希望我们帮助您,您需要解释您的用例。因为select语句是从一个网站组装而成的,例如,如果用户选择包含更详细的搜索,则select语句将被更改,最终结果看起来不同。整个应用程序是一个基于dinamic plsql代码构建的网站。