PLS-00201: 식별자가 정의되어야 합니다 해결하기 (PLS-00201: identifier must be declared)

PLS-00201: identifier must be declared 오류는 PL/SQL 실행 시 발생하는 오류 유형 중 하나입니다. 오류에 대한 직관적인 해석을 시도해 보면, 해당 식별자가 정의되어 있지 않기 때문이라는 것을 알 수 있을 것입니다. 그렇다면 해당 오류를 해결하기 위해 무엇을 해야 할까요? 답은 당연히 식별자를 정의하는 것입니다.

PLS-00201: identifier must be declared 원인

PLS-00201: 식별자가 정의되어야 합니다 해결하기

다음은 PLS-00201 식별자가 정의되어야 합니다 오류가 발생하는 예제입니다. 예제를 살펴보며 PLS-00201 오류를 해결해 보도록 하겠습니다.

DECLARE
    TABLENAME   VARCHAR1;
 BEGIN
    EXECUTE IMMEDIATE
       'INSERT INTO USER_NAME.TABLE_NAME (COLUMN_NAME) VALUES (:1) '
       USING 'BEOMSANG';
 END;
 /

ERROR at line 2:
ORA-06550: line 2, column 16:
PLS-00201: identifier 'VARCHAR1' must be declared
ORA-06550: line 2, column 16:
PL/SQL: Item ignored

PLS-00201: identifier must be declared 해결

예제자료에서 오류가 발생한 원인은 VARCHAR1라는 식별자가 오라클에서 미리 정의된 데이터유형(Predefined Datatype)도 아니고, 사용자 정의 서브타입(User-Defined Subtype)도 아니기 때문입니다.

오타 수정

데이터타입 오타로 인해 오류가 발생하였다면, VARCHAR 또는 VARCHAR2로 수정하여 해결해 주세요.

서브타입 정의

미리 정의되지 않은, 사용자 정의 서브타입인 경우 선언부에서 타입 정의가 누락되었을 것입니다. 서브타입 정의를 추가하여 해결해 주세요.

서브타입 구문

SUBTYPE subtype_name IS base_type[(constraint)] [NOT NULL];
서브타입명(subtype_name)은 기본유형(base_type)과 제약조건 및 NOT NULL 여부를 선택하여 선언할 수 있습니다.

사전정의 데이터타입은 크게 Scalar Type, Composite Type, Reference Type, LOB Type으로 나눌 수 있습니다. 우리가 흔히 알고 있는 NUMBER, VARCHAR2와 같은 데이터타입은 스칼라에 속합니다.

서브타입 예시

  • SUBTYPE CHARACTER IS CHAR; => 스칼라 타입 중, CHAR를 기본형으로 하는 CHARACTER라는 사용자 정의 서브타입입니다.
  • SUBTYPE INTEGER IS NUMBER(38,0); => NUMBER를 기본형으로 하며 프리시전 38에 스케일이 0인 서브타입입니다. 다만, INTEGER는 사전 정의 타입인데, 이렇게 선언해도 되는지는 좀 애매하네요... 실행해 보니 되기는 하는데, INTEGER와 별 차이가 크게 느껴지지는 않습니다. 아마 이렇게 사용하는 편은 거의 없을 거예요.
  • SUBTYPE BirthDate IS DATE NOT NULL;  => 기본형 DATE인 서브타입
  • SUBTYPE Counter IS NATURAL; => 기본형 NATURAL인 서브타입
  • TYPE NameList IS TABLE OF VARCHAR2(10); => RECORD, TABLE, VARRAY과 같은 데이터타입은 복합유형(Composite type)이라고 합니다. 복합유형은 타입(TYPE)으로 선언합니다.
  • SUBTYPE DutyRoster IS NameList; => TABLE을 기본형으로 하여 만든 NameList 타입을, 다시 기본형으로 하여 서브타입을 선언합니다. TABLE을 기반으로 한다고 볼 수 있습니다.
  • TYPE TimeRec IS RECORD (minutes INTEGER, hours INTEGER); => RECORD로 TimeRec이라는 타입을 선언합니다.
  • SUBTYPE FinishTime IS TimeRec; => RECORD 타입을 기본형으로 합니다.
  • SUBTYPE ID_Num IS emp.empno%TYPE; => 컬럼 타입을 기본형으로 합니다.

 

댓글