2026년 08월 01일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01789 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01789 query block has incorrect number of result columns 는?
ORA-01789 에러는 UNION, UNION ALL, INTERSECT, MINUS 등의 집합 연산자(Set Operator)를 사용할 때, 각 쿼리 블록(Query Block)이 반환하는 컬럼의 수가 서로 일치하지 않을 경우 발생하는 오류입니다. Oracle은 집합 연산자로 결합되는 모든 SELECT 구문이 동일한 수의 컬럼을 반환해야 한다는 규칙을 엄격하게 적용합니다. 실무에서는 복잡한 서브쿼리, 동적 SQL, 또는 기존 쿼리에 컬럼을 추가하는 과정에서 한쪽 블록에만 컬럼을 추가하고 다른 쪽을 수정하지 않았을 때 빈번하게 발생합니다.
주요 발생 원인
- UNION/UNION ALL 사용 시 SELECT 절의 컬럼 수 불일치
가장 흔한 원인입니다. UNION 또는 UNION ALL로 두 개 이상의 쿼리를 결합할 때, 각 SELECT 절에서 선택하는 컬럼의 수가 다를 경우 발생합니다. 예를 들어 첫 번째 쿼리는 3개의 컬럼을 반환하고, 두 번째 쿼리는 2개의 컬럼만 반환하면 Oracle은 즉시 ORA-01789를 발생시킵니다. 이 경우 개발자는 단순 오타나 컬럼 누락으로 인해 실수하는 경우가 많습니다.
- 코드 수정 과정에서 한쪽 쿼리 블록만 업데이트
운영 환경에서 기존 보고서나 뷰(View)의 SELECT 컬럼을 추가하거나 변경할 때, UNION으로 연결된 여러 블록 중 일부만 수정하고 나머지를 그대로 두었을 때 발생합니다. 특히 긴 SQL 문장에서 UNION 이하의 블록을 놓치기 쉬우며, 이는 운영 장애로 이어질 수 있습니다. 정기적인 코드 리뷰와 테스트 환경에서의 충분한 검증이 요구됩니다.
- 서브쿼리 또는 인라인 뷰에서의 컬럼 수 불일치
FROM 절이나 WHERE 절의 서브쿼리 내부에서 집합 연산자를 사용할 경우에도 동일한 문제가 발생할 수 있습니다. 복잡한 인라인 뷰 안에 UNION이 포함되어 있고, 그 내부 쿼리 블록들의 컬럼 수가 다르면 에러가 발생합니다. 중첩된 구조일수록 에러 원인을 파악하기 어렵기 때문에 각 블록을 분리하여 개별 실행하는 디버깅 방식이 효과적입니다.
해결 방법
원인 1 해결: UNION 쿼리의 컬럼 수 맞추기
문제 쿼리 예시:
-- ORA-01789 발생: 첫 번째 블록은 3개, 두 번째 블록은 2개 컬럼
SELECT emp_id, emp_name, department
FROM employees
WHERE department = 'IT'
UNION ALL
SELECT emp_id, emp_name -- department 컬럼 누락!
FROM employees
WHERE department = 'HR';
해결 쿼리 예시:
-- 해결: 두 번째 블록에 동일한 수의 컬럼 추가
SELECT emp_id, emp_name, department
FROM employees
WHERE department = 'IT'
UNION ALL
SELECT emp_id, emp_name, department -- department 컬럼 추가
FROM employees
WHERE department = 'HR';
컬럼 값이 없거나 의미 없는 자리를 채워야 할 경우 NULL 또는 리터럴 값을 사용하여 컬럼 수를 맞출 수 있습니다.
-- NULL로 컬럼 수를 맞추는 예시
SELECT emp_id, emp_name, department, salary
FROM employees
WHERE department = 'IT'
UNION ALL
SELECT emp_id, emp_name, NULL AS department, NULL AS salary
FROM contractors
WHERE contract_type = 'FULL_TIME';
원인 2 해결: 수정된 쿼리에서 모든 블록 동기화
기존 뷰나 쿼리에 컬럼을 추가했다면 반드시 UNION으로 연결된 모든 블록에 해당 컬럼을 반영해야 합니다.
-- 기존 뷰 정의 (문제 발생 전)
CREATE OR REPLACE VIEW v_all_staff AS
SELECT emp_id, emp_name, 'EMPLOYEE' AS staff_type
FROM employees
UNION ALL
SELECT con_id, con_name, 'CONTRACTOR' AS staff_type
FROM contractors;
-- 컬럼 추가 후 잘못된 수정 (ORA-01789 발생)
CREATE OR REPLACE VIEW v_all_staff AS
SELECT emp_id, emp_name, 'EMPLOYEE' AS staff_type, hire_date -- hire_date 추가
FROM employees
UNION ALL
SELECT con_id, con_name, 'CONTRACTOR' AS staff_type -- hire_date 누락!
FROM contractors;
-- 올바른 수정 (모든 블록에 컬럼 반영)
CREATE OR REPLACE VIEW v_all_staff AS
SELECT emp_id, emp_name, 'EMPLOYEE' AS staff_type, hire_date
FROM employees
UNION ALL
SELECT con_id, con_name, 'CONTRACTOR' AS staff_type, start_date AS hire_date
FROM contractors;
원인 3 해결: 서브쿼리 내부 블록 컬럼 수 일치
-- 인라인 뷰 내부 UNION에서 ORA-01789 발생 예시
SELECT *
FROM (
SELECT emp_id, emp_name, salary
FROM employees
WHERE salary > 5000
UNION
SELECT emp_id, emp_name -- salary 컬럼 누락!
FROM temp_employees
) sub_query;
-- 해결: 서브쿼리 내부 모든 블록의 컬럼 수 일치
SELECT *
FROM (
SELECT emp_id, emp_name, salary
FROM employees
WHERE salary > 5000
UNION
SELECT emp_id, emp_name, 0 AS salary -- 기본값으로 채우기
FROM temp_employees
) sub_query;
디버깅 팁: 각 블록 개별 실행
에러 발생 시 UNION으로 연결된 각 블록을 주석 처리하거나 개별적으로 실행하여 어느 블록에서 컬럼 수가 다른지 빠르게 파악할 수 있습니다.
-- 첫 번째 블록만 실행하여 컬럼 수 확인
SELECT emp_id, emp_name, department, salary
FROM employees
WHERE department = 'IT';
-- 결과: 4개 컬럼
-- 두 번째 블록만 실행하여 컬럼 수 확인
SELECT emp_id, emp_name
FROM contractors;
-- 결과: 2개 컬럼 → 불일치 확인!
예방 방법
- 컬럼 별칭(Alias)과 명시적 컬럼 나열 습관화
SELECT * 대신 반드시 컬럼명을 명시적으로 나열하는 코딩 습관을 유지하세요. 특히 UNION을 사용하는 쿼리에서는 각 블록의 컬럼 수와 데이터 타입을 주석으로 명시하거나, 코드 리뷰 체크리스트에 “UNION 블록 컬럼 수 일치 여부 확인” 항목을 포함시키는 것이 좋습니다. 또한 CI/CD 파이프라인이나 배포 전 자동화된 SQL 검증 도구(예: SQLcl, Flyway)를 활용하면 운영 환경 배포 전에 에러를 사전 차단할 수 있습니다.
- 개발 및 테스트 환경에서의 철저한 사전 검증
운영 환경에 쿼리를 적용하기 전, 반드시 개발(DEV) 또는 스테이징(STAGING) 환경에서 전체 SQL 문장을 실행하여 에러 여부를 확인하세요. 특히 뷰(View), 머터리얼라이즈드 뷰(Materialized View), 또는 패키지(Package) 내부에 UNION을 포함하는 경우, 수정 후 해당 객체를 반드시 재컴파일하고 DESCRIBE 또는 SELECT를 통해 실제 컬럼 구조를 검증하는 습관을 들이시기 바랍니다.
관련 에러
- ORA-01790:
expression must have same datatype as corresponding expression— UNION으로 연결된 블록에서 컬럼 수는 맞지만 대응되는 컬럼의 데이터 타입이 호환되지 않을 때 발생합니다. ORA-01789와 함께 집합 연산자 사용 시 주의해야 할 대표적인 에러입니다. - ORA-00904:
invalid identifier— 잘못된 컬럼명 참조 시 발생하며, 컬럼 수정 과정에서 ORA-01789와 함께 발생하는 경우가 있습니다. - ORA-00907:
missing right parenthesis— 서브쿼리나 인라인 뷰 구조가 잘못되었을 때 발생하며, 복잡한 UNION 쿼리 작성 중 구문 오류와 함께 나타날 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.