본문 바로가기
IT

ORA-00919 invalid function — 잘못된 SQL 함수 에러 원인·해결·예방

by 샤나엘 2026. 5. 12.
반응형

ORA-00919 invalid function — 잘못된 SQL 함수 에러 원인·해결·예방

Oracle Database에서 SQL을 실행하다 보면 함수 호출 부분에서 갑자기 ORA-00919: invalid function 에러를 만나는 경우가 있다. 함수명을 분명히 정확하게 썼다고 생각했는데 오류가 나면서 원인을 좁히기가 쉽지 않다.

 

본 글은 ORA-00919 에러의 정확한 의미와 자주 발생하는 5가지 원인, 단계별 해결 방법, 예방 가이드까지 정리한 트러블슈팅 자료다. 함수명 오타·타 DBMS 함수 혼용·사용자 정의 함수(UDF) 호출·패키지 함수 호출 같은 흔한 패턴을 코드 예제와 함께 다룬다.

ORA-00919 invalid function

이 글의 구성

 

01에러 메시지와 카테고리
02발생 원인 5가지
03재현 시나리오와 코드 예제
04단계별 해결 방법
05타 DBMS 함수 매핑과 예방 가이드
Q&A자주 묻는 질문 5가지

01 에러 메시지와 카테고리

ORA-00919는 Oracle Database에서 SQL 문 내 함수 호출이 인식되지 않을 때 발생하는 에러다. 공식 메시지와 분류는 다음과 같다.

항목 내용
에러 코드 ORA-00919
영문 메시지 invalid function
한국어 의미 함수 호출 형태로 입력했으나 Oracle이 인식할 수 있는 함수가 아님
Cause (공식) An entry was formatted like a function call, but it was not recognizable as an Oracle function.
Action (공식) Correct the syntax.
발생 영역 SQL SELECT·INSERT·UPDATE·DELETE 및 PL/SQL 블록 모두

ORA-00919 vs ORA-00904 차이

ORA-00919는 괄호가 붙은 함수 호출 형태(name(...))에서 함수가 인식되지 않을 때 발생한다. 반면 ORA-00904 invalid identifier는 컬럼·alias·테이블 같은 식별자가 존재하지 않을 때 발생한다. 사용자 정의 함수를 점 표기 없이 호출하면 Oracle이 식별자로 해석해 ORA-00904가 뜨는 경우도 있어 두 에러는 자주 함께 검토한다.


02 발생 원인 5가지

ORA-00919는 함수 호출 부분에서 문법이 맞지 않을 때 발생하며, 실무에서 자주 만나는 원인은 다음 5가지로 정리된다.

원인 1 — 함수명 오타

COUNTCUONT로 쓰거나 SUBSTRSUSBTR로 쓰는 등 단순 오타가 가장 흔하다. IDE 자동완성을 끄거나 사용하지 않을 때 발생 빈도가 높다.

원인 2 — 타 DBMS 함수 혼용

SQL Server의 ISNULL·GETDATE·LEN이나 MySQL의 IFNULL·NOW 같은 함수를 Oracle에 그대로 사용할 때 발생한다. Oracle은 같은 기능을 다른 함수명으로 제공하므로 매핑 확인이 필요하다.

원인 3 — 함수 인자 구분자 오류

인자 사이에 콤마(,) 대신 점(.)을 입력하거나 괄호 짝이 맞지 않을 때 발생한다. 길고 중첩된 함수 호출에서 자주 발생하며, 줄바꿈으로 인해 시각적으로 식별이 어려운 경우가 있다.

원인 4 — 사용자 정의 함수(UDF) 미존재·권한 누락

호출하려는 사용자 정의 함수가 생성되지 않았거나, 다른 스키마에 있는데 EXECUTE 권한이 없을 때 발생한다. 시노님이 잘못 설정된 경우에도 함수 인식이 실패한다.

원인 5 — 패키지 함수 호출 시 패키지명 누락

패키지 내부에 정의된 함수를 호출할 때 패키지명.함수명 형태로 작성해야 한다. 패키지명을 생략하면 Oracle이 동일한 이름의 단독 함수가 없는 한 인식하지 못한다.


03 재현 시나리오와 코드 예제

각 원인별로 실제 SQL 예제로 살펴본다.

 

원인 1 — 함수명 오타

-- ✗ 오류 발생
SELECT cunt(empno) FROM emp;
-- ORA-00919: invalid function

-- ✓ 수정
SELECT count(empno) FROM emp;

 

원인 2 — 타 DBMS 함수 혼용

-- ✗ SQL Server 문법을 Oracle에 사용
SELECT ISNULL(sal, 0) FROM emp;
-- ORA-00919: invalid function

-- ✓ Oracle 대체 함수
SELECT NVL(sal, 0) FROM emp;

-- ✗ SQL Server의 GETDATE()
SELECT GETDATE() FROM dual;
-- ORA-00919: invalid function

-- ✓ Oracle의 SYSDATE (괄호 없음)
SELECT SYSDATE FROM dual;

 

원인 3 — 함수 인자 구분자 오류

-- ✗ 콤마 대신 점을 입력
INSERT INTO t (id, val, code)
VALUES (1, SUBSTR('abc', 1).'x', 'A');
-- ORA-00919: invalid function

-- ✓ 콤마로 구분
INSERT INTO t (id, val, code)
VALUES (1, SUBSTR('abc', 1), 'x');

 

원인 4 — UDF 미존재·권한 누락

-- ✗ 함수가 생성되어 있지 않거나 다른 스키마에 존재
SELECT add_ten(price) FROM product;
-- ORA-00919: invalid function 또는 ORA-00904: invalid identifier

-- ✓ 스키마 명시 + EXECUTE 권한 확인
SELECT hr.add_ten(price) FROM product;

-- 함수 존재·소유자 확인
SELECT owner, object_type
  FROM all_objects
 WHERE object_name = UPPER('add_ten');

원인 5 — 패키지 함수 호출 시 패키지명 누락

-- ✗ 패키지명 생략
SELECT get_bonus(empno) FROM emp;
-- ORA-00919: invalid function

-- ✓ 패키지명 포함 (스키마.패키지.함수)
SELECT hr_pkg.get_bonus(empno) FROM emp;
-- 또는
SELECT hr.hr_pkg.get_bonus(empno) FROM emp;

04 단계별 해결 방법

ORA-00919를 만났을 때 다음 순서로 점검하면 빠르게 원인을 찾을 수 있다.

단계별 디버깅 순서

 

01에러 발생 위치 확인 — SQL*Plus나 IDE에서 별표(*) 마커가 가리키는 문자열 위치를 본다.
02함수명 철자·괄호·콤마 확인 — 오타와 인자 구분자가 정확한지 점검한다.
03타 DBMS 함수 혼입 검사 — ISNULL·GETDATE·LEN·NOW·IFNULL 같은 표현이 있는지 확인한다.
04함수 존재 여부 조회 — SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = UPPER('함수명')으로 존재·소유자·타입을 확인한다.
05권한·시노님 점검 — ALL_TAB_PRIVS·ALL_SYNONYMS로 EXECUTE 권한과 시노님 존재를 확인한다.
06패키지 함수면 패키지명 포함 — [스키마.]패키지명.함수명(인자) 형태로 호출 문법을 맞춘다.
07단순 SELECT로 함수 단독 실행 테스트 — SELECT 함수명(인자) FROM dual;로 함수 자체 문제인지 SQL 문맥 문제인지 분리한다.

05 타 DBMS 함수 매핑과 예방 가이드

타 DBMS에서 Oracle로 이전하거나 다중 DBMS 환경에서 작업할 때 함수 매핑을 미리 알아두면 ORA-00919를 크게 줄일 수 있다.

기능 SQL Server MySQL PostgreSQL Oracle
NULL 치환 ISNULL(a,b) IFNULL(a,b) COALESCE(a,b) NVL(a,b) / COALESCE
현재 일시 GETDATE() NOW() NOW() SYSDATE / SYSTIMESTAMP
문자열 길이 LEN(s) LENGTH(s) LENGTH(s) LENGTH(s)
문자열 연결 CONCAT / + CONCAT CONCAT / 파이프 CONCAT / 파이프
형변환 CONVERT CAST CAST TO_CHAR / TO_NUMBER / TO_DATE / CAST

예방 가이드

 

첫째, IDE 자동완성 기능을 활성화하고 Oracle 전용 SQL 개발 도구(SQL Developer·DBeaver·DataGrip 등)를 사용한다. 함수명 오타와 인자 구분자 오류를 입력 시점에 차단할 수 있다.

 

둘째, 사용자 정의 함수는 항상 스키마와 패키지명을 명시해서 호출한다. 시노님 의존을 줄이면 환경 이전 시 문제 발생을 줄일 수 있다.

 

셋째, 함수 호출 부분을 단독 SELECT 문으로 분리해 테스트하는 습관을 들인다. 복잡한 SQL 안에서 문제를 찾는 것보다 함수 단위로 검증하는 것이 빠르다.

 

넷째, 다중 DBMS 환경에서 코드를 공유할 때는 함수 매핑 표를 팀 위키에 정리해두고 코드 리뷰에서 점검한다.


06 자주 묻는 질문 5가지

Q1ORA-00919와 ORA-00904 둘 다 뜨는 경우가 있다

사용자 정의 함수를 점 표기 없이 호출하면 Oracle이 함수가 아닌 식별자로 해석해 ORA-00904가 발생할 수 있다. 반대로 괄호가 붙은 함수 호출 형태인데 함수가 인식되지 않으면 ORA-00919가 뜬다. 두 에러는 함수 인식 실패라는 점에서 연결되어 있어 함께 점검하는 것이 효율적이다.

Q2SYSDATE에 괄호를 붙여서 호출해도 되나

SYSDATE는 Oracle 공식 분류상 날짜 함수이지만 인자가 없어서 괄호 없이 호출하도록 정의되어 있다. SYSDATE()로 입력하면 ORA-00919가 발생한다. 같은 방식으로 USER·UID도 괄호 없이 사용하며, ROWNUM은 의사 컬럼(pseudo-column)으로 함수가 아니다.

Q3패키지 함수를 SQL에서 직접 호출할 수 있나

가능하다. 단 패키지 spec에 public으로 선언되어야 하고, 호출자에 EXECUTE 권한이 있어야 한다. 호출 형태는 [스키마.]패키지명.함수명(인자)이다. PL/SQL 함수가 SQL에서 호출되는 경우 Oracle이 자동으로 순수성(purity)을 판단해 부적합하면 실행이 거부된다.

Q4대소문자 차이로 ORA-00919가 발생하는 경우가 있나

표준 SQL 식별자는 대소문자 구분이 없으므로 일반적으로 영향이 없다. 다만 함수명을 큰따옴표로 감싸서 생성한 경우(예: CREATE FUNCTION "MyFunc") Oracle이 대소문자를 그대로 보존한다. 이때 호출 시에도 같은 대소문자와 따옴표로 호출해야 한다.

Q5Oracle 버전이 올라가면서 새 함수가 추가되는데 구버전에서 에러가 날 수 있나

예를 들어 LISTAGG는 11g R2부터 추가됐고, JSON 관련 함수는 12c부터 본격 지원한다. 구버전 DB에서 신버전 함수를 호출하면 ORA-00919가 발생한다. 사용하는 함수가 현재 DB 버전에서 지원되는지 공식 문서로 확인한다.


07 결론

ORA-00919는 SQL 작성 빈도에 비례해 자주 만나는 에러지만 원인이 비교적 명확해서 단계별로 점검하면 빠르게 해결할 수 있다. 핵심은 함수 호출 부분에서 문법·이름·소유자·권한이 모두 맞아야 한다는 점이다.

 

실무에서 이 에러를 줄이려면 다음 세 가지 습관이 도움이 된다.

 

첫째, Oracle 전용 IDE 자동완성을 적극 활용해 입력 단계에서 오타를 차단한다.

둘째, 사용자 정의 함수와 패키지 함수는 스키마·패키지명을 항상 명시해서 호출한다.

셋째, 다중 DBMS 환경에서 작업할 때는 함수 매핑 표를 팀 단위로 정리하고 코드 리뷰에서 점검한다.

ORA-00919는 함수 호출 문법이 맞지 않을 때 발생한다. 함수명·인자 구분자·소유자·권한을 단계별로 점검하면 빠르게 해결된다.

 

— SQL 문법 정확성과 함수 메타데이터 확인이 트러블슈팅의 핵심

트러블슈팅 체크리스트

 

01함수명 철자와 괄호·콤마 위치를 확인한다.
02타 DBMS 전용 함수(ISNULL·GETDATE·LEN 등) 사용 여부를 점검한다.
03ALL_OBJECTS 뷰로 함수 존재·소유자·타입을 확인한다.
04사용자 정의 함수는 스키마와 패키지명을 명시해서 호출한다.
05EXECUTE 권한과 시노님 설정을 점검한다.
06함수 호출 부분을 단독 SELECT로 분리해 테스트한다.
07Oracle 버전에서 해당 함수가 지원되는지 공식 문서로 확인한다.

본 글은 Oracle Database 운영·개발 시 발생하는 ORA-00919 에러의 일반적 원인과 해결 방법을 정리한 자료다. 환경·버전·권한 설정에 따라 차이가 있을 수 있으므로 운영 환경에 적용하기 전 테스트 환경에서 충분히 검증한다. Oracle 공식 문서와 최신 패치 노트를 함께 확인하면 더 안정적인 트러블슈팅이 가능하다.

 

#ORA00919 #invalidfunction #오라클에러 #Oracle #OracleDatabase #SQL함수 #PLSQL #NVL #SYSDATE #UDF #패키지함수 #DB트러블슈팅 #SQL디버깅 #ORA904 #SQL개발

반응형

댓글