Oracle 将REF游标复制到临时表
有没有一种快速方法可以将REF游标刷新到oracle中的临时表中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
光标大小将在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还是真的桌子?也许你真的只想要一个收藏?