PI_PO

SAP PO ORA-00928 오류 해결법: 대소문자 문제와 SQL 구문 체크 포인트

피오농부 2025. 7. 7. 00:38
반응형
SAP PO를 활용해 Oracle DB에 데이터를 삽입하려는 중 "ORA-00928: missing SELECT keyword" 오류가 발생했다면, SQL 구문 문제 혹은 컬럼 대소문자 불일치 문제가 주요 원인일 수 있습니다. 본 포스팅에서는 이 오류의 원인과 해결법을 초보자도 쉽게 이해할 수 있도록 정리했습니다.

목차

  • ORA-00928 오류란?
  • Oracle INSERT 구문의 기본
  • SAP PO 연동 시 자주 발생하는 SQL 오류 예시
  • 컬럼 대소문자 문제와 매핑 실패
  • Schema Validation과 Virus Scan 설정의 한계
  • 필드명 대소문자 구분의 원인과 철학
  • 대소문자 문제 해결 팁 (실무 활용)
  • 마무리 요약

ORA-00928 오류란?

Oracle에서 "ORA-00928: missing SELECT keyword"는 SQL 문에서 SELECT가 필요한데 누락되었거나, VALUES 키워드 없이 잘못된 INSERT 구문이 들어간 경우 발생합니다. 이 오류는 SAP PO에서 JDBC를 통해 데이터를 INSERT 할 때 특히 흔하게 나타납니다.

Oracle INSERT 구문의 기본

Oracle에서는 INSERT 구문을 두 가지 방식으로 작성할 수 있습니다:
  • 정적 값 삽입:
    INSERT INTO my_table (col1, col2) VALUES ('val1', 'val2');
  • SELECT 결과 삽입:
    INSERT INTO my_table (col1, col2) SELECT col1, col2 FROM another_table;
VALUES 키워드가 빠지면 Oracle은 SELECT 구문으로 오인하여 ORA-00928 오류를 발생시킵니다.

SAP PO 연동 시 자주 발생하는 SQL 오류 예시

SAP PO의 JDBC Adapter 메시지가 다음과 같이 작성된 경우:
<jdbc:sql>INSERT INTO MY_TABLE (COL1, COL2) ('val1', 'val2')</jdbc:sql>
VALUES 키워드가 빠져있기 때문에 Oracle은 SELECT를 기대하고 오류를 발생시킵니다. 올바른 예시는 다음과 같습니다:
<jdbc:sql>INSERT INTO MY_TABLE (COL1, COL2) VALUES (?, ?)</jdbc:sql>
그리고 <jdbc:parameter>를 통해 값을 주입해야 합니다.

컬럼 대소문자 문제와 매핑 실패

문제가 복잡해지는 지점은 바로 컬럼명의 대소문자 불일치입니다. PostgreSQL은 기본적으로 소문자 컬럼을 사용하고, Oracle은 대문자로 처리하기 때문에 다음과 같은 문제가 발생합니다:
<row>
  <id>123</id>
  <name>James</name>
</row>
위처럼 소문자로 들어오는 데이터를 PO에서 대문자 SQL로 삽입하려 하면, Oracle은 컬럼명을 인식하지 못하고 오류를 반환합니다.

Schema Validation과 Virus Scan 설정의 한계

  • Virus Scan: 메시지 내 바이러스 검사를 담당하며, 메시지 구조나 필드명과는 무관합니다.
  • Schema Validation: XSD 유효성 검사 여부를 결정하지만, 필드명의 대소문자 구분 자체는 여전히 유지됩니다.
즉, 이 설정들로 대소문자 구분 문제를 해결할 수는 없습니다.

필드명 대소문자 구분의 원인과 철학

XML 기반 메시지 처리

SAP PO는 내부적으로 모든 메시지를 XML 구조로 처리합니다. XML은 대소문자를 엄격히 구분하며, <name>과 <Name>은 완전히 다른 노드로 간주됩니다.

XSD 정의의 엄격함

SAP PO의 데이터타입 정의는 결국 XML Schema(XSD)에 기반하며, 이 구조 또한 대소문자 구분을 필수로 합니다. <xs:element name="FirstName"/>과 firstname은 서로 다른 요소입니다.

일관성과 오류 방지를 위한 SAP 설계 철학

SAP PO, CPI, Gateway 등은 명시적이고 강한 타입 체크를 중시하며, 통합 시 혼선을 방지하기 위해 필드명 일치를 강제합니다.

대소문자 문제 해결 팁 (실무 활용)

1. Message Mapping에서 명시적 필드명 매핑

필드명이 다를 경우 수동 매핑을 통해 정확히 일치시킵니다.

2. Groovy 또는 XSLT로 노드명 수정

import com.sap.gateway.ip.core.customdev.util.Message;
import groovy.xml.*

def Message processData(Message message) {
    def body = message.getBody(String)
    def xml = new XmlParser().parseText(body)

    xml.depthFirst().each { node ->
        if (node instanceof Node) {
            node.name = node.name().toString().toUpperCase()
        }
    }

    def sw = new StringWriter()
    new XmlNodePrinter(new PrintWriter(sw)).print(xml)
    message.setBody(sw.toString())
    return message
}

3. 소스 시스템에서 필드명 조정 요청

가능하다면 소스 시스템에서 메시지를 SAP PO에 맞춰 필드명을 조정하는 것이 가장 안전한 방법입니다.

4. Integration Engine의 Trace 활용

Trace 기능을 통해 메시지 매핑, SQL 구문 생성 등 과정을 확인할 수 있습니다.

마무리 요약

SAP PO와 Oracle DB 연동 시 발생하는 ORA-00928 오류는 단순 SQL 구문 오류일 수도 있고, 컬럼명 대소문자 불일치 같은 구조적 문제일 수도 있습니다. 이 문제를 해결하려면 SQL 구문 점검과 함께, 매핑 구조의 일관성을 반드시 확보해야 합니다.
PO는 XML 기반이므로 대소문자에 매우 민감하며, 이를 무시할 수 있는 기능은 없습니다. 매핑, 메시지 처리, 어댑터 설정 모두에서 정확성을 유지하는 것이 중요합니다.
반응형