원인: 변수 앞에 콜론(:)이 누락되었습니다
ABAP에서 Native SQL(EXEC SQL) 구문 안에서 ABAP 변수를 참조하려면 반드시 변수 이름 앞에 콜론(:)을 붙여야 합니다. 콜론이 없으면 데이터베이스가 해당 값을 ABAP 변수로 인식하지 못하고, 그 결과 SY-DATUM 같은 시스템 변수의 날짜 값이 테이블에 정상적으로 저장되지 않습니다.
아래와 같이 수정하면 문제가 해결됩니다:
EXEC SQL.
INSERT INTO order VALUES('2', :sy-datum)
ENDEXEC.
콜론(:)은 Native SQL 구문 내에서 호스트 변수(host variable), 즉 ABAP 프로그램의 변수를 바인딩하겠다는 의미입니다. 이 구분자가 있어야 데이터베이스 인터페이스가 실행 시점에 실제 변수 값을 전달할 수 있습니다.
Native SQL 대신 OpenSQL 사용을 권장합니다
추가로, 이 경우에는 Native SQL보다 OpenSQL을 사용하는 것이 좋습니다. 두 구문의 용도 차이는 다음과 같습니다:
- OpenSQL: ABAP 런타임이 자동으로 처리하며, 모든 SAP 지원 데이터베이스에서 동일하게 동작하는 추상화된 SQL 구문입니다. 변수 참조 시 별도의 콜론 표기가 필요 없고, 구문 오류나 보안 문제(SQL 인젝션 등)의 위험도 상대적으로 낮습니다.
- Native SQL: 데이터베이스 고유의 기능(HINT, 특수 함수, 저장 프로시저 호출 등)을 사용해야 할 때만 활용하는 것이 적합합니다.
질문자님께서 작성하신 INSERT 쿼리는 매우 일반적인 형태로, 특정 백엔드 데이터베이스에 종속적인 기능을 전혀 사용하지 않고 있습니다. 따라서 아래처럼 OpenSQL로 변환하는 것이 유지보수성과 이식성 면에서 훨씬 유리합니다:
INSERT INTO order
VALUES @VALUE('2'), @sy-datum.
" 또는 신규 문법 예시:
INSERT order FROM @( VALUE #( id = '2' date = sy-datum ) ).
정리
날짜 값이 채워지지 않는 직접적인 원인은 :sy-datum처럼 변수 앞 콜론 누락입니다. 다만 해당 쿼리가 데이터베이스 고유 기능을 사용하지 않으므로, 가급적 OpenSQL로 재작성하는 것을 권장합니다.