-第二步骤

问题描述 投票:1回答:1
CREATE OR REPLACE PROCEDURE P2(V_SAL NUMBER) AS RETURN_VALUE SYS_REFCURSOR; TYPE TTT IS RECORD(FIRST_NAME VARCHAR2(30),LAST_NAME VARCHAR2(20)) ; I TTT; TYPE TNAME IS TABLE OF TTT INDEX BY BINARY_INTEGER; K TNAME; BEGIN P1(V_SAL,RETURN_VALUE); FETCH RETURN_VALUE BULK COLLECT INTO K; FORALL X IN K.FIRST..K.LAST INSERT INTO T1 VALUES (K(X).FIRST_NAME,K(X).LAST_NAME); CLOSE RETURN_VALUE; END; /

第12行的错误:PLS-00436:实现限制:无法引用BULK In-BIND记录表的字段

但是如果我尝试插入for循环,那么它工作正常。当我使用Forall(bulk bind)时,它不工作

-我的第一个过程创建或替换过程P1(V_SALARY NUMBER,OUTPUT_VALUE OUT SYS_REFCURSOR)作为开始OUTPUT_VALUE以便从薪水&...]的雇员中选择FIRST_NAME,LAST_NAME开头
[当您尝试从另一个过程返回collectionsys_refcursor时尝试进行批量绑定时,这似乎有些错误或限制。但是,您还有许多其他选项,而不是批量绑定(使用FORALL循环),它们的性能相同。]

替代如下:

oracle plsql oracle10g plsql-package
1个回答
0
投票
选项2:使用P1参数将procedure声明为OUT,然后使用collection作为直接路径插入。

CREATE OR REPLACE procedure p11 ( v_salary NUMBER ,output_value OUT v_ret_val ) AS BEGIN SELECT return_value(first_name,last_name) Bulk collect into output_value FROM employees WHERE salary > v_salary; END; ------------------------------ CREATE OR REPLACE PROCEDURE p2 ( v_sal NUMBER) AS k v_ret_val; BEGIN p11(v_sal,k); For i in 1..k.count Loop dbms_output.put_line(k(i).first_name || k(i).last_name); End Loop; INSERT /*+Append*/ INTO t1 Select t.first_name,t.last_name from (table( k )) t; END;

选项3:使用P1参数将procedure声明为OUT,然后使用目标表将Merging声明为集合。

CREATE OR REPLACE PROCEDURE p2 ( v_sal NUMBER ) AS k v_ret_val; BEGIN p11(v_sal,k); For i in 1..k.count Loop dbms_output.put_line(k(i).first_name || k(i).last_name); End Loop; MERGE INTO t1 tgt Using ( Select t.first_name, t.last_name from table ( k ) t ) src on ( tgt.first_name = src.first_name and tgt.last_name = src.first_name ) When not matched then insert ( tgt.first_name, tgt.last_name ) values ( src.first_name, src.last_name ); END;

执行:

Exec P2(1000);

输出:

SQL> Select * from t1; FIRST_NAME LAST_NAME ------------------------------------------- E F C D

© www.soinside.com 2019 - 2024. All rights reserved.