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

时间:2015-01-27 20:45:03

标签: oracle plsql

我的目的是获取输出变量中的数据" c"存储过程。此变量的类型为SYS_REFCURSOR。但我遇到了问题。它说:"结果与查询不匹配"。

这是代码

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;

我很感激。

2 个答案:

答案 0 :(得分:3)

Ref游标不是变量,而是指针。所以我们无法进入它们。

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

OPEN c FOR
   SELECT stvmjr.stvmajr_code,stvmjr.stvmajr_desc

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

c := aa;

答案 1 :(得分:1)

游标只是对已打开的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;

分享并享受;

相关问题