Oracle ORA-00938 오류 원인과 해결 방법 완벽 가이드

ORA-00938
2026년 06월 20일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-00938 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-00938 not enough arguments for function 는?

ORA-00938 에러는 Oracle SQL 또는 PL/SQL에서 특정 함수를 호출할 때 해당 함수가 요구하는 인수(Argument)의 개수보다 적은 수의 인수를 전달했을 때 발생하는 에러입니다. 즉, 함수의 시그니처(Signature)에 정의된 필수 매개변수를 모두 채우지 않은 채 함수를 호출하면 Oracle 파서(Parser)가 이를 감지하고 해당 에러를 반환합니다. 이 에러는 주로 개발자가 함수의 문서를 제대로 확인하지 않거나, 사용자 정의 함수(User Defined Function)의 매개변수 구조를 변경한 후 기존 호출부를 수정하지 않았을 때 자주 발생합니다.


주요 발생 원인

1. 내장 함수(Built-in Function) 호출 시 필수 인수 누락

Oracle이 제공하는 내장 함수들은 각각 최소한으로 요구하는 인수의 개수가 정해져 있습니다. 예를 들어 REPLACE 함수는 최소 2개, SUBSTR 함수는 최소 2개의 인수를 요구하는데, 이를 무시하고 더 적은 인수를 전달하면 ORA-00938이 발생합니다. 특히 함수 레퍼런스를 충분히 숙지하지 않은 신규 개발자나 다른 DBMS(MySQL, MSSQL 등)에서 Oracle로 마이그레이션하는 과정에서 이 실수가 빈번하게 발생합니다.

2. 사용자 정의 함수(UDF) 매개변수 변경 후 호출부 미수정

프로젝트 진행 중 비즈니스 로직이 변경되어 사용자 정의 함수에 필수 매개변수를 추가했음에도 불구하고, 해당 함수를 호출하는 SQL 쿼리나 PL/SQL 블록을 빠짐없이 수정하지 않은 경우에 이 에러가 발생합니다. 운영 환경에서 함수 스펙이 변경되는 경우 영향도 분석이 충분히 이루어지지 않으면 예상치 못한 곳에서 ORA-00938이 터질 수 있습니다. 이는 실무에서 가장 골치 아픈 케이스 중 하나로, 여러 패키지와 프로시저에 걸쳐 누락된 부분을 찾아야 하는 상황이 발생합니다.

3. 동적 SQL(Dynamic SQL) 생성 오류로 인한 인수 누락

EXECUTE IMMEDIATEDBMS_SQL 패키지를 사용하는 동적 SQL 환경에서는 런타임에 SQL 문자열이 조합되기 때문에, 조건 분기에 따라 함수 호출부에서 인수가 빠지는 경우가 발생할 수 있습니다. 문자열 연결(Concatenation) 로직의 버그로 인해 특정 조건에서만 인수가 생략되어 ORA-00938이 발생하는 케이스는 정적 SQL 환경보다 디버깅이 훨씬 어렵습니다. 동적 SQL은 컴파일 타임에 문법 검사가 이루어지지 않기 때문에 테스트 커버리지가 낮으면 운영 환경에서 처음 발견되는 경우도 많습니다.


해결 방법

해결 1: 내장 함수 필수 인수 확인 및 보완

아래는 REPLACE 함수를 잘못 호출한 예와 올바른 호출 예입니다.

-- 잘못된 예: REPLACE 함수는 최소 2개의 인수가 필요 (문자열, 검색어)
-- 아래는 인수가 1개만 전달되어 ORA-00938 발생
SELECT REPLACE('Hello World') FROM DUAL;

-- 올바른 예: 검색어(search_string)와 대체어(replacement)를 모두 지정
SELECT REPLACE('Hello World', 'World', 'Oracle') FROM DUAL;
-- 결과: Hello Oracle

-- SUBSTR 함수 잘못된 예: 시작 위치 인수 누락
SELECT SUBSTR('OracleDatabase') FROM DUAL;
-- ORA-00938 발생

-- SUBSTR 함수 올바른 예: 문자열과 시작 위치 필수 지정
SELECT SUBSTR('OracleDatabase', 1, 6) FROM DUAL;
-- 결과: Oracle

해결 2: 사용자 정의 함수 호출부 동기화

함수 스펙이 변경된 경우, 아래와 같이 ALL_ARGUMENTS 딕셔너리를 통해 현재 함수의 인수 목록을 확인하고, 호출부를 수정합니다.

-- 변경된 함수의 인수 목록 확인
SELECT ARGUMENT_NAME,
       POSITION,
       DATA_TYPE,
       IN_OUT,
       DEFAULTED
FROM   ALL_ARGUMENTS
WHERE  OBJECT_NAME = 'YOUR_FUNCTION_NAME'
  AND  OWNER       = 'YOUR_SCHEMA'
ORDER BY POSITION;

-- 기존 잘못된 호출 예 (매개변수 p_dept_id 누락)
-- CREATE OR REPLACE FUNCTION get_emp_salary(p_emp_id NUMBER, p_dept_id NUMBER) ...
SELECT get_emp_salary(101) FROM DUAL;
-- ORA-00938 발생

-- 수정된 올바른 호출 예
SELECT get_emp_salary(101, 10) FROM DUAL;

-- 영향받는 객체 전체 조회 (수정 대상 파악)
SELECT NAME, TYPE, LINE, TEXT
FROM   ALL_SOURCE
WHERE  UPPER(TEXT) LIKE UPPER('%get_emp_salary%')
  AND  OWNER = 'YOUR_SCHEMA'
ORDER BY TYPE, NAME, LINE;

해결 3: 동적 SQL 디버깅 및 인수 보완

동적 SQL에서 생성된 쿼리를 로그로 남겨 문제를 파악하고 수정합니다.

DECLARE
    v_sql    VARCHAR2(4000);
    v_param1 VARCHAR2(100) := 'SALES';
    v_param2 VARCHAR2(100) := 'REPLACE_VALUE';
    v_result VARCHAR2(4000);
BEGIN
    -- 잘못된 동적 SQL 생성 예 (인수 누락 케이스)
    v_sql := 'SELECT REPLACE(:1) FROM DUAL';
    
    -- 디버깅을 위해 생성된 SQL 출력
    DBMS_OUTPUT.PUT_LINE('실행 SQL: ' || v_sql);
    
    -- 올바른 동적 SQL 생성 예
    v_sql := 'SELECT REPLACE(:1, :2, :3) FROM DUAL';
    DBMS_OUTPUT.PUT_LINE('수정된 SQL: ' || v_sql);
    
    EXECUTE IMMEDIATE v_sql
        INTO v_result
        USING v_param1, 'OLD_VALUE', v_param2;
    
    DBMS_OUTPUT.PUT_LINE('결과: ' || v_result);
    
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('에러 발생 SQL: ' || v_sql);
        DBMS_OUTPUT.PUT_LINE('에러 코드: ' || SQLCODE);
        DBMS_OUTPUT.PUT_LINE('에러 메시지: ' || SQLERRM);
        RAISE;
END;
/

예방 방법

1. 함수 호출 전 Oracle 공식 문서 및 딕셔너리를 통한 인수 검증 습관화

모든 함수 호출 전에 반드시 Oracle 공식 SQL Reference 또는 ALL_ARGUMENTS 딕셔너리 뷰를 통해 필수 인수의 개수와 타입을 사전에 확인하는 습관을 들여야 합니다. 특히 타 DBMS에서 익숙하게 쓰던 함수를 Oracle에서 사용할 때는 문법이 다를 수 있으므로 반드시 Oracle 레퍼런스를 별도로 확인해야 합니다. 팀 내부에서는 공통 함수 라이브러리에 대한 변경 이력과 현재 인수 목록을 위키(Wiki) 형태로 관리하여 모든 개발자가 최신 스펙을 쉽게 참조할 수 있도록 하는 것이 좋습니다.

2. CI/CD 파이프라인에 SQL 정적 분석 및 회귀 테스트 통합

사용자 정의 함수의 시그니처를 변경할 때는 반드시 영향도 분석 스크립트를 수행하고, 변경된 함수와 연관된 모든 패키지, 프로시저, 트리거를 자동으로 재컴파일(DBMS_UTILITY.COMPILE_SCHEMA 또는 ALTER PACKAGE ... COMPILE)하고 그 결과를 검증하는 자동화 테스트를 구축해야 합니다. Oracle SQL Developer, Toad 등의 IDE에서 제공하는 정적 분석 도구나 PL/SQL 컴파일 경고 기능(ALTER SESSION SET PLSQL_WARNINGS = 'ENABLE:ALL')을 활성화하여 배포 전에 문제를 사전에 감지하는 체계를 마련하는 것이 중요합니다.


관련 에러

  • ORA-00939: too many arguments for function — ORA-00938의 반대 케이스로, 함수에 허용된 것보다 더 많은 인수를 전달했을 때 발생합니다.
  • ORA-06553: PLS-306: wrong number or types of arguments in call to 'function_name' — PL/SQL 환경에서 함수 호출 시 인수의 개수 또는 타입이 맞지 않을 때 발생하는 에러로, ORA-00938과 유사한 상황에서 발생합니다.
  • ORA-00904: invalid identifier — 함수 인수로 잘못된 컬럼명이나 변수명을 전달했을 때 동반하여 발생할 수 있습니다.
  • ORA-06512: PL/SQL 블록에서 에러 발생 위치(라인 번호)를 나타내며, ORA-00938과 함께 스택 트레이스에 표시될 수 있습니다.
DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기