>

아래 코드에서 nestedTable payment_obj를 상위 프로 시저에서 하위 프로 시저로 전달하려고 시도했지만 하위 프로 시저에서 상위 프로 시저에서 초기화 한 후에도 데이터가 중첩 된 테이블에 삽입 될 수 없습니다. ERROR-초기화되지 않은 콜렉션에 대한 참조 " * 원인 : 중첩 테이블 또는 varray의 요소 또는 멤버 함수            참조 됨 (초기화 컬렉션이 필요한 경우)            컬렉션이 초기화되지 않은 경우

자식 프로 시저의 지불 테이블에 삽입해야하는 중첩 테이블에 데이터를 수집하고 상위 프로 시저의 중첩 테이블에 수집 된 지불 테이블에 데이터를 삽입하고 있습니다. 중첩 테이블에서 불가능한 경우 이러한 유형의 요구 사항을 달성하는 방법

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;


  • 답변 # 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;
    
    

  • 이전 access vba - 현재 버전에서 컴파일되지 않는 기존 코드를 주석 처리하면 위험합니까?
  • 다음 ecmascript 6 - momentjs를 사용하지 않고 자바 스크립트로 날짜 형식을 지정하는 방법