从存储过程中获取 SYS_REFCURSOR out 变量的问题

Issue fetching into SYS_REFCURSOR out variable from stored procedure

我的目的是在存储过程的输出变量"c"中获取数据。此变量的类型为 SYS_REFCURSOR。但我有问题。它说:"results do not match with query".

这是代码

PROCEDURE SP_BUSCAR_AL(VE_PROGRAM               IN VARCHAR2,
                             VE_TIPO_CAMPO_ESTUDIO  IN NUMBER,
                             VE_CODE_ESCUELA    IN VARCHAR2,
                             VE_NOMBRE_ALTERNATIVA  IN VARCHAR2,
                             c OUT SYS_REFCURSOR) IS
BEGIN
DECLARE

VL_PROGRAM             VARCHAR2(100);
VL_TIPO_CAMPO_ESTUDIO  NUMBER;
VL_CODE_ESCUELA        VARCHAR2(100);
VL_NOMBRE_ALTERNATIVA  VARCHAR2(100);
aa SYS_REFCURSOR;

BEGIN

  VL_PROGRAM                := VE_PROGRAM;
  VL_TIPO_CAMPO_ESTUDIO     := VE_TIPO_CAMPO_ESTUDIO;
  VL_CODE_ESCUELA     := VE_CODE_ESCUELA;
  VL_NOMBRE_ALTERNATIVA     := VE_NOMBRE_ALTERNATIVA;


  BEGIN
     OPEN aa FOR
       SELECT stvmjr.stvmajr_code,stvmjr.stvmajr_desc
        FROM smrprle,
             sobcurr,
             sorccon,
             stvmajr stvmjr,
             govsdav
        WHERE  
             govsdav_pk_parenttab = stvmajr_code 
             AND stvmajr_code = sorccon_majr_code_conc  
             AND sorccon_curr_rule = sobcurr_curr_rule 
             AND sobcurr_program = smrprle_program 
             AND govsdav_table_name LIKE '%STVMAJR%' 
             AND govsdav_attr_name = 'TIPO_CAMPO_ESTUDIO' 
             AND govsdav_value_as_char = 1
             AND smrprle_program = VL_PROGRAM
             ; 

loop
fetch aa into c; --It says results do not match here
exit when aa%notfound;
end loop;

END SP_BUSCAR_AL;

非常感谢。

Ref 游标不是变量,它们是指针。所以我们不能进入他们。

在您的情况下,您需要做的就是在打开游标时使用 OUT 参数...

OPEN c FOR
   SELECT stvmjr.stvmajr_code,stvmjr.stvmajr_desc

或者你可以直接分配它...

c := aa;

游标只是对已打开的 SELECT 语句的引用。您需要将游标的结果提取到适当的变量中,以便您可以使用它们。因此,让我们更新您的程序来执行此操作:

PROCEDURE SP_BUSCAR_AL(VE_PROGRAM  IN  VARCHAR2
                       c           OUT SYS_REFCURSOR)
IS
BEGIN
  OPEN c FOR
    SELECT stvmjr.stvmajr_code,stvmjr.stvmajr_desc
      FROM smrprle,
           sobcurr,
           sorccon,
           stvmajr stvmjr,
           govsdav
      WHERE govsdav_pk_parenttab = stvmajr_code 
        AND stvmajr_code = sorccon_majr_code_conc  
        AND sorccon_curr_rule = sobcurr_curr_rule 
        AND sobcurr_program = smrprle_program 
        AND govsdav_table_name LIKE '%STVMAJR%' 
        AND govsdav_attr_name = 'TIPO_CAMPO_ESTUDIO' 
        AND govsdav_value_as_char = 1
        AND smrprle_program = VE_PROGRAM;     
END SP_BUSCAR_AL;

我删除了所有未使用的参数,以及也未使用的局部变量。

现在,在使用该过程时,您应该首先调用该过程,并在游标上循环以获取结果,然后再使用它们:

DECLARE
  CSR           SYS_REFCURSOR;
  stvMajr_code  STVMAJR%STVMAJR_CODE%TYPE;
  stvMajr_desc  STVMAJR%STVMAJR_DESC%TYPE;
BEGIN
  SP_BUSCAR_AL(VE_PROGRAM => 'some value',
               c          => CSR);

  LOOP
    FETCH CSR
      INTO stvMajr_code,
           stvMajr_desc;
    EXIT WHEN CSR%NOTFOUND;

    DBMS_OUTPUT.PUT_LINE('CODE=''' || stvMajr_code ||
                         '''  DESC=''' || stvMajr_desc || '''');
  END LOOP;
END;

分享和享受;