簡體   English   中英

循環中的Oracle查找函數返回rowtype如何從rowtype獲取字段

[英]Oracle lookup function in loop returns rowtype how to get fields from rowtype

我有一個運行select的過程(我測試的結果是返回56條記錄),然后當我運行游標時,我想將3個字段傳遞給一個函數(請參見上文),該函數將從包含15個表的表中查找/選擇一條記錄百萬條記錄(價值10年)。

它返回一個行類型,然后我要從該行類型記錄中提取字段,以運行帶有第一個選擇記錄和從查找功能獲取的其他字段的插入。

如果我運行該過程,則控制台會打印出我的測試消息,但是當我嘗試運行時

選擇*從v_processed_claim批量收集到v_tab_proc_claim_recs中;

由於錯誤(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;  

你可以這樣做:

 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM