我有一个外部存储过程,它循环调用内部存储过程。内部存储过程返回REF CURSOR
由 2 个部分组成的 (1) V_SUCCESSFUL_COUNT
(2) V_RESPONSE_CODE
。
我的外部存储过程正在将所有内部存储过程调用中的这些对收集到相应的数组V_SUCCESSFUL_COUNTS
和中V_RESPONSE_CODES
。首先,它打开内部存储过程的游标,将两个部分提取到变量中,然后将这些变量添加到数组中。
PROCEDURE OUTER_SP(PARAM1, .., P_REF_CURSOR REF CURSOR)
AS
..
V_SUCCESSFUL_COUNT NUMBER;
V_RESPONSE_CODE VARCHAR2(10);
V_SUCCESSFUL_COUNTS REF_TYPE_NUM_TABLE := REF_TYPE_NUM_TABLE(); /* Cumulative Successful Counts */
V_RESPONSE_CODES REF_VARCHAR2_ARRAY_TABLE := REF_VARCHAR2_ARRAY_TABLE(); /* Cumulative Response Codes */
V_REF_CURSOR SYS_REFCURSOR; /* Result from each inner SP */
FOR i IN 1 .. P_REF_ID_LIST.COUNT LOOP
SP_INNER(PARAM1,
PARAM2,
...
V_REF_CURSOR);
/* Add V_SUCCESSFUL_COUNT, V_RESPONSE_CODE outputs from this call to collections */
OPEN V_REF_CURSOR /* Error here! */;
FETCH V_REF_CURSOR INTO V_SUCCESSFUL_COUNT, V_RESPONSE_CODE;
V_SUCCESSFUL_COUNTS.EXTEND;
V_SUCCESSFUL_COUNTS(V_SUCCESSFUL_COUNTS.COUNT) := V_SUCCESSFUL_COUNT;
V_RESPONSE_CODES.EXTEND;
V_RESPONSE_CODES(V_RESPONSE_CODES.COUNT) := V_RESPONSE_CODE;
CLOSE V_REF_CURSOR /* Error here! */;
END LOOP;
我收到此错误
OPEN V_REF_CURSOR / CLOSE V_REF_CURSOR
当我尝试从每个内部存储过程调用中检索结果时:
PLS-00382:表达式类型错误
它不喜欢我在调用之前打开内部存储过程的游标FETCH V_REF_CURSOR
。
如果我删除这些OPEN V_REF_CURSOR
/CLOSE V_REF_CURSOR
行并直接转到FETCH V_REF_CURSOR
,则没有语法错误并且存储过程可以编译,但是添加到数组中的结果不正确(NULL
),正如我在运行这个外部存储过程时看到的那样。
如果您正在使用
SYS_REFCURSOR
数据类型,那么您可能已经使用了OPEN v_ref_cursor FOR ...
,SP_INNER
在这种情况下,再次尝试使用OPEN
游标在语法上是无效的,因为它已经打开。删除该
OPEN v_refcursor;
语句(但不删除该CLOSE
语句)并且代码似乎可以工作:然后:
输出:
小提琴
我怀疑它
SP_INNER
什么也没有返回。这里有一个演示,展示了如何做到这一点(如果一切顺利)。
这是一个返回一些数据的查询;它用于
SP_INNER
:我的
SP_INNER
程序非常简单;这里唯一“重要”的事情是用于引用游标的查询确实返回了一些东西:匿名 PL/SQL 块模拟您的
OUTER_SP
:正如您所见,输出反映了
select
语句本身返回的内容,因此 - 它有效。由于您没有得到任何东西,请检查
SP_INNER
正在做什么。除此之外,
for
循环使用P_REF_ID_LIST.COUNT
但你从未说过p_ref_id_list
是什么/包含什么。如果那里什么都没有,循环根本就不会执行,所以这可能是另一个罪魁祸首。P_REF_ID_LIST.COUNT
在循环中使用它之前显示值以验证其值。