从存储过程中获取 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;
分享和享受;
我的目的是在存储过程的输出变量"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;
分享和享受;