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 기반이므로 대소문자에 매우 민감하며, 이를 무시할 수 있는 기능은 없습니다. 매핑, 메시지 처리, 어댑터 설정 모두에서 정확성을 유지하는 것이 중요합니다.
반응형