programing

초기화되지 않은 컬렉션 PL/SQL 참조

javajsp 2023. 10. 6. 20:53

초기화되지 않은 컬렉션 PL/SQL 참조

받겠습니다ORA-06531: Reference to uninitialized collection저장 프로시저를 실행할 때 다음과 같은 세부 정보가 포함됩니다.

사용자 정의 데이터 유형:

CREATE OR REPLACE TYPE T IS TABLE OF VARCHAR2;

저장 프로시저 정의:

CREATE OR REPLACE PROCEDURE TEST ( u IN T, v OUT T)
IS
BEGIN
  FOR i IN u.FIRST..u.LAST LOOP
    v(i) := u(i);
  END LOOP;
END;

다음을 사용하여 프로시저를 호출합니다.

DECLARE
  v_t T;
  u_t T;
BEGIN
  v_t := T();
  v_t.EXTEND(2);

  v_t(1) := "This is test1";
  v_t(2) := "This is test2";
  TEST(v_t, u_t);
END;

테스트 절차에서 다음과 같은 사항이 있습니다.vOUT 파라미터로 선언됨 - 이는 절차에서 출력 수집을 초기화해야 함을 의미합니다(예:).v := T();). 호출 블록을 초기화하도록 변경해도u_t이것은 도움이 되지 않을 것입니다.u_t수집은 절차에 전달되지 않고 절차가 전달된 내용만 수신합니다.

다음과 같이 코드를 변경합니다.

CREATE OR REPLACE PROCEDURE TEST ( u IN T, v OUT T) IS
  i NUMBER := u.FIRST;
BEGIN
  v := T();
  v.EXTEND(u.COUNT);

  IF i IS NOT NULL THEN
    LOOP
      v(i) := u(i);
      i := u.NEXT(i);
      EXIT WHEN i IS NULL;
    END LOOP;
  END IF;
END TEST;

DECLARE
  v_t T;
  u_t T;
BEGIN
  v_t := T();
  v_t.EXTEND(2);

  v_t(1) := 'This is test1';
  v_t(2) := 'This is test2';

  TEST(v_t, u_t);

  FOR i IN u_t.FIRST..u_t.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(u_t(i));
  END LOOP;
END;

PL/SQL의 문자열 상수는 큰따옴표가 아니라 작은따옴표로 묶어야 합니다.

또한 절차와 호출 블록에서 의미가 반대인 유사 변수 이름을 사용하는 것은 혼란을 가중시킬 뿐입니다.의미 있는 이름을 사용하는 습관을 들이면 나중에 많은 혼란을 피할 수 있을 것입니다.

나누어서 즐겨요.

오늘도 비슷한 질문이 있었는데, u_t 변수를 초기화하셔야 하고, 이 답변을 확인해주시면 더 많은 정보를 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/25201903/reference-to-uninitialized-collection-pl-sql