Функция поиска Oracle в цикле возвращает тип строки, как получить поля из типа строки

У меня есть процедура, которая запускает выбор (я тестировал, что хороший результат возвращает 56 записей), а затем, когда я запускаю курсор, я хочу передать 3 поля функции (см. Выше), которая будет искать / выбирать запись из таблицы, содержащей 15 миллионов записей (за 10 лет).

Он возвращает тип строки, который я хочу затем извлечь поля из этой записи типа строки, чтобы запустить вставку как с записями из первого выбора, так и с дополнительными полями, полученными из функции поиска.

Если я запустил процедуру, консоль распечатает мои тестовые сообщения, но когда я попытаюсь запустить

выберите * массовый сбор в v_tab_proc_claim_recs из v_processed_claim;

он не компилируется из-за ошибки (97,65): PL / SQL: ORA-00942: таблица или представление не существует

как будто это не таблицы.

Правильно ли я делаю это ... как я могу это сделать, почему он не видит таблицу, в которую я пытаюсь извлечь?

Должен ли я сделать это как-нибудь по-другому ...

Спасибо за любую помощь / предложения :)

Функция ниже ....

create or replace function get_processed_claim_rec(

    p_provider VARCHAR2,
    p_rx VARCHAR2,
    p_record_no  NUMBER 
)


 return i_idb.processed_claim%rowtype
  as
    l_claim_record i_idb.processed_claim%rowtype;
  begin

    select * into l_claim_record from i_idb.processed_claim
      where source_date = p_provider
      AND rx = p_rx
      AND rec_no = p_record_no;


   return(l_claim_record);
  end;

И процедура ...

create or replace PROCEDURE import_mailer_data

  AS
    -------------------------------

    /**
        for the lookup table
    **/
    v_processed_claim  i_idb.processed_claim%rowtype;
    TYPE proc_claim_recs IS TABLE OF v_processed_claim%ROWTYPE INDEX BY PLS_INTEGER;
    v_tab_proc_claim_recs proc_claim_recs;
    --------------------------------

    CURSOR myCursor
    IS
    SELECT * 
      from
      (   
      SELECT
        j.create_date as open_date,
        case when (j.create_date < (sysdate - 20) )
            then 'POD'
            else 'REG'
        end as priority,
        c.division,
        c.unit,
        --p.refill as days_supply,
        --p.din_name,
       'CM_JOHN' as log_code,
        c.first_name,
        c.last_name,
        --p.UNLISTED_compound,
        --p.intervention_code,
        --p.substitution,
        --p.confirm,
        c.PROVIDER,
        c.rx,
        c.DISPENSE_DATE,
        c.DIN,
        c.QTY,
        c.DIN_COST_PAID,
        c.DISP_FEE_PAID,
        c.PAID_AMOUNT,
        c.SOURCE_DATE,
        c.RECORD_NO,
        c.RELATIONSHIP,
        c.INSURER_NO,
        c.GROUP_NO,
        c.CERTIFICATE,
        c.BIRTH_DATE,
        c.USER_ID,
        --p.rej_code --v_seq_no
          rank() over
          (
            partition by c.provider, c.rx, c.record_no Order by c.provider desc, c.rx desc

          ) as RNK         
      FROM AUDITCOLLECTIONS.MAILER_CLAIMS c,
        AUDITCOLLECTIONS.MAILER_JOBS j
      WHERE MAILER_JOB_DETAIL_ID IN
        (SELECT MAILER_JOB_DETAIL_ID
        FROM AUDITCOLLECTIONS.MAILER_JOB_DETAILS
        WHERE MAILER_JOB_ID IN
          ( SELECT MAILER_JOB_ID FROM AUDITCOLLECTIONS.MAILER_JOBS
          )
        )

        AND ( c.PROVIDER, c.rx, c.record_no ) NOT IN
          ( SELECT provider, rx, rec_no FROM  AUDITCOLLECTIONS.COLLECTION_AUDIT_STAGING
          )
        AND j.create_date > (sysdate - 30)
        AND c.provider = '2010500042'
      ) A_Latest
      where A_Latest.RNK = 1;

    BEGIN
    v_report_id := audit_load.create_loaded_report(v_report_type_id);

      FOR curRec IN myCursor
      LOOP
        BEGIN
          dbms_output.put_line ('===>>>> PRINTING TEST1 = ');        

        v_processed_claim := get_processed_claim_rec(curRec.PROVIDER, curRec.RX, curRec.RECORD_NO);


        select * bulk collect into v_tab_proc_claim_recs from v_processed_claim; 



      END LOOP;

      audit_load.update_status_to_loaded(v_report_id);
    END import_mailer_data;  

person JohnnyO    schedule 25.08.2017    source источник
comment
как если бы любой из них не был таблицами - v_processed_claim - это переменная типа %rowtype - это не таблица!   -  person Tony Andrews    schedule 25.08.2017
comment
да, Тони, и я пытаюсь вывести запись из этого в таблицу, чтобы я мог использовать / выбирать ее в своем цикле с помощью курсора ....   -  person JohnnyO    schedule 25.08.2017


Ответы (1)


Ты можешь сделать это:

 FOR curRec IN myCursor
  LOOP

      v_processed_claim := 
         get_processed_claim_rec(curRec.PROVIDER, curRec.RX, curRec.RECORD_NO);

      v_tab_proc_claim_recs (v_tab_proc_claim_recs.COUNT+1) := v_processed_claim;

  END LOOP;

Или упростите до:

 FOR curRec IN myCursor
  LOOP

      v_tab_proc_claim_recs (v_tab_proc_claim_recs.COUNT+1) :=
        get_processed_claim_rec(curRec.PROVIDER, curRec.RX, curRec.RECORD_NO);

  END LOOP;
person Tony Andrews    schedule 25.08.2017
comment
Привет, Тони, спасибо, что собрал! Затем, в контексте описанной выше процедуры, как мне затем получить поля из таблицы v_tab_proc_claim_recs ... сделать еще один выбор и курсор на этой таблице записей? - person JohnnyO; 25.08.2017
comment
Вы не можете выбирать из этого массива индекса, вы можете просто зацикливать его по одной записи за раз. - person Tony Andrews; 26.08.2017