Oracle 从变量传递游标名称
我有一个包,其中包含一个过程(接受一个输入参数;游标名称)和两个游标。 该过程使用输入参数指定的光标Oracle 从变量传递游标名称,oracle,Oracle,我有一个包,其中包含一个过程(接受一个输入参数;游标名称)和两个游标。 该过程使用输入参数指定的光标 PROCEDURE insertdetails(typ IN VARCHAR2) IS BEGIN OPEN typ; LOOP FETCH typ INTO colA; EXIT WHEN typ%notfound; --MISSING CODE END LOOP; END; 如果我运行程序并将cursor的名称作为
PROCEDURE insertdetails(typ IN VARCHAR2) IS
BEGIN
OPEN typ;
LOOP
FETCH typ INTO colA;
EXIT WHEN typ%notfound;
--MISSING CODE
END LOOP;
END;
如果我运行程序并将cursor的名称作为输入参数传递,我会得到错误PLS-00456:项目“TYP”不是光标
它们是否是解决此问题的方法您需要使用REF游标来完成此操作 您的过程定义如下所示:
PROCEDURE insertdetails(typ IN sys_refcursor) IS
在此过程中,您可能不会打开游标,通常在定义游标的代码中的其他位置打开它。假设游标在包中的其他位置声明,您可以使用参数决定使用哪个实际游标,例如:
PROCEDURE insertdetails(typ IN VARCHAR2) IS
BEGIN
IF typ = 'CURSOR_A' THEN
OPEN cursor_a;
LOOP
FETCH cursor_a INTO colA;
EXIT WHEN cursor_a%notfound;
--MISSING CODE
END LOOP;
ELSE
OPEN cursor_b;
LOOP
FETCH cursor_b INTO colA;
EXIT WHEN cursor_b%notfound;
--MISSING CODE
END LOOP;
END IF;
END;
或者,如果丢失的代码很常见,很可能:
PROCEDURE insertdetails(typ IN VARCHAR2) IS
BEGIN
IF typ = 'CURSOR_A' THEN
OPEN cursor_a;
ELSE
OPEN cursor_b;
END IF;
LOOP
IF typ = 'CURSOR_A' THEN
FETCH cursor_a INTO colA;
EXIT WHEN cursor_a%notfound;
ELSE
FETCH cursor_b INTO colA;
EXIT WHEN cursor_b%notfound;
END IF;
--MISSING CODE
END LOOP;
END;
无论哪种方式,您可能更喜欢
案例
而不是if
;特别是如果typ
可以表示的可能游标的数量增加。我认为您无法做到这一点。您可以传入一个sql语句,如果有帮助的话,您可以执行它?你能提供你正在传递的游标的详细信息吗?两个游标从相同的表中选取相同数量的记录,但每个游标的条件不同。然后,程序将插入这些记录。