Ваш синтаксис правильный.
Следующий тестовый код корректно работает в пустой схеме:
create table t_uar_reviews(
review_id number,
created_date date
)
/
create table t_uar_cases(
review_id number,
UAR_CASE_ID number,
UAR_REVIEW_ID number,
CASE_TYPE varchar2(10),
CASE_NMBR number,
active_flag varchar2(1),
created_date date)
/
create package PK_FCP_EXTRACT is
PROCEDURE sp_fcp_extract;
end;
/
create or replace PACKAGE BODY PK_FCP_EXTRACT is
PROCEDURE sp_fcp_extract is
cursor Rev_cur is select * from t_uar_reviews where CREATED_DATE=trunc(sysdate) ;
r Rev_cur%rowtype;
cursor case_cur( c_revid IN t_uar_reviews.review_id%type )
is select *
from t_uar_cases where review_id= c_revid ;
c case_cur%rowtype;
begin
open Rev_cur;
loop
fetch Rev_cur into r;
exit when Rev_cur%notfound;
open case_cur( r.review_id );
loop
fetch case_cur into c;
exit when case_cur%notfound;
dbms_output.put_line(c.UAR_CASE_ID||','||c.UAR_REVIEW_ID||','||c.CASE_TYPE||','||c.CASE_NMBR||','||c.ACTIVE_FLAG||','|| c.CREATED_DATE);
end loop;
close case_cur;
end loop;
close Rev_cur;
end;
END PK_FCP_EXTRACT;
Возможные причины неполадок:
- Убедитесь, что что пакет spe c был создан первым (
CREATE PACKAGE
) - Убедитесь, что пакет создан в схеме, которая владеет
t_uar_reviews
и t_uar_cases
, или в схеме, которая имеет direct SELECT
предоставление для таблиц (не через роль). - Убедитесь, что все столбцы, на которые вы ссылаетесь в пакете, существуют в таблицах.
Если все это сделано, это должно работать.
Чтобы упростить задачу, попробуйте использовать этот альтернативный синтаксис для ваших циклов курсора:
for r in Rev_cur loop
for c in Case_cur(r.review_id) loop
...do something..
end loop;
end loop;
Используя этот метод, вам не нужно определять запись r
или c
; они неявно создаются, и вам не нужно открывать / извлекать / проверять / закрывать курсоры.