我的目的是获取输出变量中的数据" 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;
我很感激。
答案 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;
分享并享受;