Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 将REF游标复制到临时表_Oracle_Database Connection - Fatal编程技术网

Oracle 将REF游标复制到临时表

Oracle 将REF游标复制到临时表,oracle,database-connection,Oracle,Database Connection,有没有一种快速方法可以将REF游标刷新到oracle中的临时表中 光标大小将在5K到100K行之间变化 目前我正在使用for循环,但速度非常慢 无法更改某些函数调用函数的OUT参数 DECLARE v_return SYS_REFCURSOR; VAR_A varchar2(100); VAR_B varchar2(100); BEGIN v_return := SOME_FUNCTION_CALL(); LOOP FETCH v_return into VAR_A,VAR_B EXIT

有没有一种快速方法可以将REF游标刷新到oracle中的临时表中
光标大小将在5K到100K行之间变化
目前我正在使用for循环,但速度非常慢
无法更改某些函数调用函数的OUT参数

DECLARE
v_return SYS_REFCURSOR;
VAR_A varchar2(100);
VAR_B varchar2(100);

BEGIN 
 v_return := SOME_FUNCTION_CALL();
LOOP
FETCH v_return into VAR_A,VAR_B
EXIT WHEN v_return%NOTFOUND
          INSERT INTO temp_table(a,b) values (VAR_A,VAR_B);
END LOOP;
CLOSE v_return;
END LOOP;
可能不会

通过对本地集合执行
批量收集
,而不是逐行获取,您可能会提高代码的效率。差不多

DECLARE 
  TYPE vc100_tbl IS TABLE OF VARCHAR2(100);

  l_return    SYS_REFCURSOR;
  l_var_a_tbl vc100_tbl;
  l_var_b_tbl vc100_tbl;
BEGIN
  l_return := some_function_call();

  LOOP
    FETCH l_return
     BULK COLLECT INTO l_var_a_tbl, l_var_b_tbl
    LIMIT 100;

    EXIT WHEN l_var_a_tbl.count = 0;

    FORALL i IN 1 .. l_var_a_tbl.count
      INSERT INTO temp_table( a, b )
        VALUES( l_var_a_tbl(i), l_var_b_tbl(i) );
  END LOOP;

  close l_return;
END;
这将减少SQL和PL/SQL引擎之间发生的上下文转移的数量。但是,根据你对“非常慢”的定义,环境变化似乎不太可能是你最紧迫的问题。如果我猜的话,我敢打赌,如果您的代码对于该术语的大多数定义都“非常慢”,那么问题很可能是用于在
some_函数中打开光标的查询速度慢,并且您的大部分时间都花在执行该查询上,以便生成要获取的行。如果是这样的话,您应该优化查询


从架构上看,这种方法似乎也有相当大的问题。即使您不能更改函数的定义,您是否可以做一些事情来分解函数正在执行的查询,以便您可以使用相同的代码而不调用函数?例如,您能否将函数调用的查询分解到视图中,然后从代码中调用该视图

填充集合然后进行
forall
批量插入可能会更快;可能是为了减少内存的使用,这将是一个问题。这是GTT还是真的桌子?也许你真的只想要一个收藏?