초기화되지 않은 컬렉션 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
'programing' 카테고리의 다른 글
| c에 데이터 유형이 없는 변수 선언 (0) | 2023.10.06 |
|---|---|
| Spring: Response Entity를 사용하여 빈 HTTP 응답을 반환하는 것이 작동하지 않습니다. (0) | 2023.10.06 |
| UITextField 반환 키에 대한 작업을 추가하는 방법은 무엇입니까? (0) | 2023.10.06 |
| strpbrk는 무엇의 약자입니까? (0) | 2023.10.06 |
| Google Maps API v3 infowwindow 닫기 이벤트/콜백? (0) | 2023.10.06 |