오라클 12C 를 이용하여 델파이로 응용프로그램 개발시 이해할수없는 Alert Log문의 1

by 박길동 [Oracle Admin] [2023.01.03 12:08:14]


안녕하세요

저는 델파이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 ';

by pajama [2023.01.03 12:41:07]

오라클 MOS에 비슷한 문서가 있는데 조회는 못회봐서 내용은 알수가 없네요.

아래 블로그에도 비슷한 사례가 있는데..DB 자체에는 영향이 없나봅니다.

https://positivemh.tistory.com/675

정확한 분석은 기술지원에 요청하시는게 좋을듯 합니다.


by 박길동 [2023.01.04 12:11:24]

답변 감사합니다. 오라클쪽에 기술 지원 요청을 말하는걸까요..?

DBA는 쿼리 오류라고 수정하라고만하는데

이유도 모르고 빈줄삭제 뭐이런 의미없는 일을 하고있으니 갑갑스럽네요


by pajama [2023.01.04 13:31:04]

네 오라클 지원을 말씀드린겁니다. 제가 찾은 문서는 아래입니다. (ORA-00923)

https://support.oracle.com/knowledge/Oracle%20Database%20Products/2649163_1.html

https://community.oracle.com/tech/developers/discussion/4086738/warning-too-many-parse-errors-count-sql-hash-in-alert-log

https://jonathanlewis.wordpress.com/2017/10/06/12c-parse/

DBA분이 쿼리를 수정하라고 하셨다니 이런 문서 전달드리면 불편해하실지도 모르겠군요..

이 문서내용에 workaround라도 있으면 좋겠는데 저는 볼수가 없네요. 

오류코드가 ORA-00923인걸보면 문법오류인데, 문법에 문제가 없는 경우에도 위와 같은 현상이 발생한 케이스가 있는 것 같습니다. 위 블로그의 댓글대로 shared pool에 캐시된 쿼리의 parsing 문제라면 쿼리를 좀 변형해서 테스트 해보시는건 어떨까요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입