Pl sql Ошибки пакета - PullRequest
       4

Pl sql Ошибки пакета

0 голосов
/ 09 января 2020

Код ниже получает много ошибок. Просто хочу проверить, правильный ли мой синтаксис кода. Основная логика c, стоящая за пакетом, состоит в том, чтобы получить все случаи для отдельного обзора и спулингировать их в файл с помощью сценария оболочки. На данный момент я концентрируюсь на пакете.

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;

1 Ответ

1 голос
/ 10 января 2020

Ваш синтаксис правильный.

Следующий тестовый код корректно работает в пустой схеме:

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; они неявно создаются, и вам не нужно открывать / извлекать / проверять / закрывать курсоры.

...