我有一个包含一个过程(带一个输入参数;游标名称)和两个游标的包。 该过程是使用输入参数
指定的游标 PROCEDURE insertdetails(typ IN VARCHAR2) IS
BEGIN
OPEN typ;
LOOP
FETCH typ INTO colA;
EXIT WHEN typ%notfound;
--MISSING CODE
END LOOP;
END;
如果我运行程序并传递cusrsor的名称作为输入参数我得到错误PLS-00456:item'TYP'不是游标 他们是出路吗?
答案 0 :(得分:2)
您需要使用REF CURSORS来执行此操作。 Here's a pretty good explanation
您的程序定义如下:
PROCEDURE insertdetails(typ IN sys_refcursor) IS
您可能无法在此过程中打开游标,通常是在其他位置打开游标,在定义游标的代码中。
答案 1 :(得分:0)
假设游标在包中的其他位置声明,您可以使用该参数来决定使用哪个实际游标,例如:
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;
无论哪种方式,您可能更喜欢case
而不是if
;特别是如果typ
可能代表的可能游标数量增加。