안녕하세요
저는 델파이7개발자 입니다. 오라클12c디비를 이용하여 응용프로그램을 개발하고 테스트 하고있습니다.
그러나 델파이상에서는 문제가 없는 쿼리가 오라클에서는 Alert Log에 해당 쿼리가 PARSE ERROR가 발생합니다.
해당 소스로 만든 exe는 정상적으로 실행이 되는데 왜 alert log에 오류로 발생하는지 이해가 되지 않습니다.
아래 샘플을 보시고 조언 부탁드립니다.
----number 1 (실제 델파이 소스)-----
SQL.Text := 'Select Distinct ' + #13#10 +
' Ju.JFDATE, Ju.JFJBNO, Ju.JLFCOD, Ju.JPTCNO, Ju.JPTNAM ' + #13#10 +
' , Ju.JJUBNO, Ju.JJUBGN, Ju.JJUBNF, Ju.JCHASU, Ju.JTONO1 ' + #13#10 +
' , Ju.JTONO2, Ju.JGYEAR, Ju.JHPLCE, Ju.JFPLCE, Ju.JMDRNO ' + #13#10 +
' , Pa.PAJUMN1, Pa.PAJUMN2, Pa.PAJUMNE, Pa.PAJUSEX, Pa.PABIRDT, Pa.PABIRGN ' + #13#10 +
' , Cs.CACOMNM ';
SQL.Text := SQL.Text + //alert 때문에 삭제
' From JUAAAA Ju ' + #13#10 +
' Inner Join PATNAAA Pa On Ju.JLFCOD = Pa.PALFCOD ' + #13#10 +
' '; //alert 때문에 삭제
If Ms_GumKd <> '' Then
Begin
SQL.Text := SQL.Text +
' Inner Join JGKAAA Jg On Ju.JJUBNO = Jg.JGJUBNO ' + #13#10 +
' And Jg.JGGUMKD In (''A'') ' + #13#10 +
' ';
End
Else
SQL.Text := SQL.Text + ' Left Join JGKAAA Jg On Ju.JJUBNO = Jg.JGJUBNO ';
SQL.Text := SQL.Text +
' Left Join CSAAA Csrtle On Ju.JCOMNO = Cs.CACOMNO ' + #13#10 +
' Where Ju.JFDATE BetWeen :SDATE And :EDATE ';
-----------number 2 (Oracle ALERT LOG) -------------
2022-12-20T08:22:36.346916+09:00
WARNING: too many parse errors, count=100 SQL hash=0x760ea2f0
PARSE ERROR: ospid=15085, error=923 for statement:
2022-12-20T08:22:36.347396+09:00
Select Distinct
Ju.JFDATE, Ju.JFJBNO, Ju.JLFCOD, Ju.JPTCNO, Ju.JPTNAM
, Ju.JJUBNO, Ju.JJUBGN, Ju.JJUBNF, Ju.JCHASU, Ju.JTONO1
, Ju.JTONO2, Ju.JGYEAR, Ju.JHPLCE, Ju.JFPLCE, Ju.JMDRNO
, Pa.PAJUMN1, Pa.PAJUMN2, Pa.PAJUMNE, Pa.PAJUSEX, Pa.PABIRDT, Pa.PABIRGN
, Cs.CACOMNM
Additional information: hd=4fbe81b80 phd=4f86bf640 flg=0x28 cisid=960 sid=960 ciuid=960 uid=960
-------number 3 (alert log발생안하게 델파이 소스 수정본 ) --------
SQL.Text := 'Select Distinct ' + #13#10 +
' Ju.JFDATE, Ju.JFJBNO, Ju.JLFCOD, Ju.JPTCNO, Ju.JPTNAM ' + #13#10 +
' , Ju.JJUBNO, Ju.JJUBGN, Ju.JJUBNF, Ju.JCHASU, Ju.JTONO1 ' + #13#10 +
' , Ju.JTONO2, Ju.JGYEAR, Ju.JHPLCE, Ju.JFPLCE, Ju.JMDRNO ' + #13#10 +
' , Pa.PAJUMN1, Pa.PAJUMN2, Pa.PAJUMNE, Pa.PAJUSEX, Pa.PABIRDT, Pa.PABIRGN ' + #13#10 +
' , Cs.CACOMNM From JUAAAA Ju ' + #13#10 +
' Inner Join PATNAAA Pa On Ju.JLFCOD = Pa.PALFCOD ';
If Ms_GumKd <> '' Then
Begin
SQL.Text := SQL.Text +
' Inner Join JGKAAA Jg On Ju.JJUBNO = Jg.JGJUBNO ' + #13#10 +
' And Jg.JGGUMKD In (''A'') ' + #13#10 +
' ';
End
Else
SQL.Text := SQL.Text + ' Left Join JGKAAA Jg On Ju.JJUBNO = Jg.JGJUBNO ';
SQL.Text := SQL.Text +
' Left Join CSAAA Csrtle On Ju.JCOMNO = Cs.CACOMNO ' + #13#10 +
' Where Ju.JFDATE BetWeen :SDATE And :EDATE ';
오라클 MOS에 비슷한 문서가 있는데 조회는 못회봐서 내용은 알수가 없네요.
아래 블로그에도 비슷한 사례가 있는데..DB 자체에는 영향이 없나봅니다.
https://positivemh.tistory.com/675
정확한 분석은 기술지원에 요청하시는게 좋을듯 합니다.
답변 감사합니다. 오라클쪽에 기술 지원 요청을 말하는걸까요..?
DBA는 쿼리 오류라고 수정하라고만하는데
이유도 모르고 빈줄삭제 뭐이런 의미없는 일을 하고있으니 갑갑스럽네요
네 오라클 지원을 말씀드린겁니다. 제가 찾은 문서는 아래입니다. (ORA-00923)
https://support.oracle.com/knowledge/Oracle%20Database%20Products/2649163_1.html
https://jonathanlewis.wordpress.com/2017/10/06/12c-parse/
DBA분이 쿼리를 수정하라고 하셨다니 이런 문서 전달드리면 불편해하실지도 모르겠군요..
이 문서내용에 workaround라도 있으면 좋겠는데 저는 볼수가 없네요.
오류코드가 ORA-00923인걸보면 문법오류인데, 문법에 문제가 없는 경우에도 위와 같은 현상이 발생한 케이스가 있는 것 같습니다. 위 블로그의 댓글대로 shared pool에 캐시된 쿼리의 parsing 문제라면 쿼리를 좀 변형해서 테스트 해보시는건 어떨까요?