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
'2.2 DB > Oracle Error' 카테고리의 다른 글
[Oracle Error] ORA-00996: "the concatenate operator is ||, not |" /연접 연산자는 | 이 아니고 || 입니다 (0) | 2024.10.17 |
---|---|
[PL/SQL Error] PL/SQL 에러 모음 (PLS-CODE) (0) | 2024.10.14 |
[Oracle Error] ORA-00932: "inconsistent datatypes" /일관성 없는 데이터 유형 (0) | 2024.10.10 |
[Oracle Error] Oracle 에러 모음 (ORA-CODE) (0) | 2024.10.09 |
[Oracle Error] ORA-00907: "missing right parenthesis" / 우괄호가 없습니다. (0) | 2024.10.09 |
댓글