2013-09-30 84 views
2

我有一个包含过程(接受输入参数;光标名称)和两个光标的包。 的程序是使用通过输入参数传递变量的光标名称

PROCEDURE insertdetails(typ IN VARCHAR2) IS 
    BEGIN 
    OPEN typ; 
    LOOP 
     FETCH typ INTO colA; 
     EXIT WHEN typ%notfound; 
     --MISSING CODE 
    END LOOP; 
    END; 

指定如果我运行该过程,并通过对cusrsor作为输入参数i获得的错误PLS-00456的名称的光标:项“TYP”不是游标 是他们的出路

+0

我不认为你可以做到这一点。你可以传递一个你可以执行的sql语句,如果有帮助的话?你能提供你正在传递的光标的细节/你想要达到的目标吗? – ChrisProsser

+0

两个游标都从同一个表中选择相同数量的记录,但每个记录的条件都不相同。记录将被插入程序。 – lyno

回答

2

您将需要使用REF CURSORS来做到这一点。 Here's a pretty good explanation

你的程序的定义是这样的:

PROCEDURE insertdetails(typ IN sys_refcursor) IS 

你可能不会在此过程中打开游标,通常你打开它在其他地方,在光标定义的代码。

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; 

无论哪种方式,你可能更喜欢在caseif;特别是如果typ可以代表的可能光标的数量增加。

+0

将与此合作。谢谢 – lyno