【问题标题】:How to Pass nested table into sub procedures如何将嵌套表传递给子过程
【发布时间】:2018-07-27 13:24:27
【问题描述】:

在下面的代码中,我试图将nestedTable payment_obj 从父过程传递给子过程,但在子过程中无法将数据插入嵌套表中,因为即使在父过程中初始化之后它也会抛出错误-对未初始化集合的引用” *原因:嵌套表或可变数组的元素或成员函数 被引用(需要初始化集合的地方) 没有初始化集合。

我正在将数据收集到需要插入到子过程中的付款表中的嵌套表中,并将数据插入到在父过程中的嵌套表中收集的付款表中。如果嵌套表不可能实现这种类型的要求。

CREATE OR REPLACE
PACKAGE pkg_payment
AS
PROCEDURE PROCESS_PAYMENTS;
END pkg_payment;

CREATE OR REPLACE
PACKAGE body pkg_payment
AS
type typ_payment
IS
  record
  (
    payment_id payment1.payment_id%type,
    );
type tab_typ_payment
IS
  TABLE OF typ_payment;
PROCEDURE prepare_payments(payment_obj OUT tab_typ_payment )
IS
  tab_typ_payment_INDEX NUMBER ( 2 ) := 0 ;

BEGIN
  payment_obj.extend;
tab_typ_payment_INDEX:= payment_obj.count;
  payment_obj ( tab_typ_payment_INDEX ) .payment_id :=tab_typ_payment_INDEX;

END prepare_payments;

PROCEDURE PROCESS_PAYMENTS
IS
  payment_obj tab_typ_payment:= tab_typ_payment();
CURSOR C_PUIDS_CUR
  IS
    (
    select puid from payments
    );
type PUIDS
IS
  TABLE OF C_PUIDS_CUR%rowtype;
PUIDS_OBJ PUIDS := PUIDS();
BEGIN
  OPEN C_PUIDS_CUR;
  LOOP
    FETCH C_PUIDS_CUR bulk collect INTO PUIDS_OBJ limit 100;
    BEGIN
      FOR I_ROW_PUID IN 1 .. PUIDS_OBJ .count
      LOOP
         prepare_payments( payment_obj);
      END LOOP; -- FOR LOOP
    END;        -- END for fetch begin
    EXIT
  WHEN C_PUIDS_CUR %notfound;
  END LOOP; -- End for limit loop
  CLOSE C_PUIDS_CUR ;
  forall i IN 1 .. payment_obj.count SAVE EXCEPTIONS
  INSERT INTO payment1 VALUES payment_obj
    (i
    );
END PROCESS_PAYMENTS;
END pkg_payment;

【问题讨论】:

    标签: sql stored-procedures oracle11g plsqldeveloper


    【解决方案1】:

    过程prepare_payments需要初始化payment_obj

    我不确定这是什么意思,但以下运行没有错误:

    create table payment1 (payment_id number);
    create table payments (puid integer);
    
    insert into payments (puid) values (1);
    
    create or replace package pkg_payment
    as
        procedure process_payments;
    end pkg_payment;
    /
    
    create or replace package body pkg_payment as
        type typ_payment is record
        ( payment_id payment1.payment_id%type );
    
        type tab_typ_payment is table of typ_payment;
    
        procedure prepare_payments
            ( payment_obj out tab_typ_payment )
        is
            tab_typ_payment_index number(2) := 0;
        begin
            payment_obj := tab_typ_payment();  -- Initialised here
            payment_obj.extend;
            tab_typ_payment_index := payment_obj.count;
            payment_obj(tab_typ_payment_index).payment_id := tab_typ_payment_index;
        end prepare_payments;
    
    
        procedure process_payments is
            payment_obj tab_typ_payment := tab_typ_payment();
    
            cursor c_puids_cur is
                select puid from payments;
    
            type puids is table of c_puids_cur%rowtype;
            puids_obj puids := puids();
        begin
            open c_puids_cur;
            loop
                fetch c_puids_cur bulk collect into puids_obj limit 100;
    
                for i_row_puid in 1 .. puids_obj.count loop
                    prepare_payments(payment_obj);
                end loop;
    
                exit when c_puids_cur%notfound;
            end loop;
    
            close c_puids_cur;
    
            forall i in 1 .. payment_obj.count save exceptions
                insert into payment1 values payment_obj (i);
    
        end process_payments;
    end pkg_payment;
    

    【讨论】:

      猜你喜欢
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 2014-09-11
      • 2016-10-05
      • 2017-08-23
      • 2021-10-22
      相关资源
      最近更新 更多