본문 바로가기
2.2 DB/Oracle Error

[PL/SQL Error] ORA-06553: PLS- 221 : is not a procedure or is undefined / 는 프로시저가 아니거나 정의되지 않았습니다

by Dohi._. 2024. 10. 14.
728x90

ORA-06553의 에러는 PLS의 에러코드를 띄워주는 에러코드이다.

 

ORA-06553: PLS-221

  • ' ' is not a procedure or is undefined
  • '  '는 프로시저가 아니거나 정의되지 않았습니다

PLS-221 주로 나타나는 이유는 SQL문에서 상수를 참조할때 일어나는 코드입니다

PL/SQL에서 만든 상수는 일반 sql에서 직접 불러올 수 없습니다.

 

실제 에러메시지

 

그럼 일단 일반sql문에서 상수를 꼭 쓰고싶을 경우

해결방법 

1. 우선 테스트를 위해서 package 만들겠습니다

상수에 성인나이 기준을 만들겠습니다.

CREATE PACKAGE my_dohi_pkg 
	AS
    adult_age CONSTANT NUMBER(2) := 19;
END my_dohi_pkg;

 

 

2. 일반 SQL문에서 상수를 불러서 where절을 사용해보면

SELECT age
  FROM (
		SELECT 17 AS age FROM dual
		UNION ALL
		SELECT 26 AS age FROM dual
)
 WHERE age > my_dohi_pkg.adult_age

 

ORA-06553: PLS-221: 'adult_age' is not a procedure or is undefined

ORA-06553: PLS-221: 'adult_age' 는 프로시저가 아니거나 정의되지 않았습니다.
의 에러가 발생할 겁니다.

 

3. 다시 새로 package 대체해보겠습니다.

일단 헤더와 body구분을 하고 시작하겠습니다.

코드에 함수에 상수를 넣어놓겠습니다

CREATE OR REPLACE PACKAGE my_dohi_pkg  -- 기존의 my_dohi_pkg있다면 대체 없다면 새로생성
	AS
    FUNCTION adult_age RETURN NUMBER;
END my_dohi_pkg;
CREATE OR REPLACE PACKAGE BODY my_dohi_pkg AS
    cons_adult_age CONSTANT NUMBER(2) := 42; 

    FUNCTION adult_age RETURN NUMBER IS
    BEGIN
        RETURN cons_adult_age;
    END adult_age;

END my_dohi_pkg;

 

4. 이제는 함수에서 불러오기 때문에 상수에 대해서 일반SQL접근이 제약되지 않았습니다.

SELECT age
  FROM (
	    SELECT 17 AS age FROM dual
	    UNION ALL
        SELECT 26 AS age FROM dual
)
 WHERE age > my_dohi_pkg.adult_age();

 

정상적으로 결과가 출력됩니다.

AGE
26

 

아 모르겠고 그냥 바로 쓰고싶다고 !

Query하나 의탭으로 테스트할땐 이렇게도 가능하다

EXEC :test := my_dohi_pkg.adult_age;

select :test as test from dual;
728x90

댓글