CI 묻고 답하기

제목 Toad 와 같은 DB관리 도구에서 실행되는 쿼리가 simple_query에서는 에러가납니다.
글쓴이 래디안트 작성시각 2013/05/28 03:48:56
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 15643   RSS
안녕하세요.

우선 개발환경은 Web 서버는 Ubuntu Server 기반에 Apache2 + PHP5 이구요.
DB 서버는 Oracle 을 사용하고 있습니다.

CI를 이용해서 간단한 Web UI를 작성하다가 기존에 별도로 제작하여 사용중이던 cron을
CI쪽으로 병합하는 과정에서 문제가 생겨서 질문드립니다.

문제가 되는 쿼리는 아래와 같습니다.

MERGE INTO MLMS_DAILY_STAT AA
     USING (  SELECT A.DET_DATE, COUNT (A.DET_DATE) AS ABN_CNT
                FROM (  SELECT TO_CHAR (
                                    TO_DATE ('1970-01-01', 'YYYY-MM-DD')
                                  + NUMTODSINTERVAL (MAX (UD_REGTIME), 'SECOND')
                                  + NUMTODSINTERVAL (9, 'HOUR'),
                                  'YYYY-MM-DD')
                                  AS DET_DATE
                          FROM MLMS_URI_DETECTION
                         WHERE UD_REGTIME > (TRUNC(SYSDATE - 1) - TO_DATE('01-01-1970 09:00:00', 'MM-DD-YYYY HH24:MI:SS')) * 86400
                      GROUP BY UW_IDX, U_IDX) A
            GROUP BY A.DET_DATE
            ORDER BY A.DET_DATE) BB
        ON (AA.DS_DATE = BB.DET_DATE)
WHEN MATCHED
THEN
   UPDATE SET AA.DS_ABN_CNT = BB.ABN_CNT
WHEN NOT MATCHED
THEN
   INSERT     (AA.DS_DATE, AA.DS_ABN_CNT)
       VALUES (BB.DET_DATE, BB.ABN_CNT)

이 쿼리를 독립적으로 PHP OCI 모듈을 이용해서 작업할 때는 문제없이 동작하고 있었으며,
Toad와 같은 DB관리 도구에서도 정상적으로 실행되는 쿼리입니다.

헌데 이 쿼리를 CI쪽으로 가져와서 simple_query() 함수의 인자로 전달하면 그냥 FALSE가 나타납니다.. ㅠ

해당 쿼리를 query() 함수에 전달하면 아래와 같은 오류가 나타나구요.. ㅠㅠ
(콘솔화면에서 실행하는 것이라 HTML 태그가 그대로 보이는 점 양해 부탁드립니다.)
 <div id="container">
                <h1>데이터베이스 오류가 발생하였습니다.</h1>
                <p>Error Number: </p><p></p><p>MERGE INTO MLMS_DAILY_STAT AA
     USING (  SELECT A.DET_DATE, COUNT (*) AS ABN_CNT
                FROM (  SELECT TO_CHAR (
                                    TO_DATE ('1970-01-01', 'YYYY-MM-DD')
                                  + NUMTODSINTERVAL (MAX (UD_REGTIME), 'SECOND')
                                  + NUMTODSINTERVAL (9, 'HOUR'),
                                  'YYYY-MM-DD')
                                  AS DET_DATE
                          FROM MLMS_URI_DETECTION
                         WHERE UD_REGTIME > '1369580400'
                      GROUP BY UW_IDX, U_IDX) A
            GROUP BY A.DET_DATE
            ORDER BY A.DET_DATE) BB
        ON (AA.DS_DATE = BB.DET_DATE)
WHEN MATCHED
THEN
   UPDATE SET AA.DS_ABN_CNT = BB.ABN_CNT
WHEN NOT MATCHED
THEN
   INSERT     (AA.DS_DATE, AA.DS_ABN_CNT)
       VALUES (BB.DET_DATE, BB.ABN_CNT)</p><p>Filename: /home/ldh0227/public_html/models/cron_model.php</p><p>Line Number: 37</p>  </div>

이상한 점은 오류코드에 대한 정보가 비어있는채로 나타난다는 것이구요..

이런 경우에는 어떻게 해야 할까요...?
태그 오라클,Oracle,simple_query
 다음글 session 생성 후 초기화 (3)
 이전글 ci 라이센스? 관련 질문입니다.. (2)

댓글

milosz / 2013/05/28 08:17:06 / 추천 0
 escape 문제일 듯 한데 모델 부분에 어떻게 작성하셨는지 확인해야 정확히 알 수 있을 것 같네요.
오류코드로 확인이 안되면 profiler를 켜서 확인해보는 것도 좋은 방법입니다.
한대승(불의회상) / 2013/05/28 09:08:31 / 추천 0
$this->output->enable_profiler();
simple_query()로 테스트 하시면 실제 CI가 해석하는 쿼리가 나올듯 하네요.
래디안트 / 2013/05/28 11:41:52 / 추천 0
 모델에서 함수는 아래와 같이 작성했습니다.
function makeDailyStatABN() {  
  $strQuery = <<<EOD
MERGE INTO MLMS_DAILY_STAT AA
     USING (  SELECT A.DET_DATE, COUNT (A.DET_DATE) AS ABN_CNT
                FROM (  SELECT TO_CHAR (
                                    TO_DATE ('1970-01-01', 'YYYY-MM-DD')
                                  + NUMTODSINTERVAL (MAX (UD_REGTIME), 'SECOND')
                                  + NUMTODSINTERVAL (9, 'HOUR'),
                                  'YYYY-MM-DD')
                                  AS DET_DATE
                          FROM MLMS_URI_DETECTION
                         WHERE UD_REGTIME > (TRUNC(SYSDATE - 1) - TO_DATE('01-01-1970 09:00:00', 'MM-DD-YYYY HH24:MI:SS')) * 86400
                      GROUP BY UW_IDX, U_IDX) A
            GROUP BY A.DET_DATE
            ORDER BY A.DET_DATE) BB
        ON (AA.DS_DATE = BB.DET_DATE)
WHEN MATCHED
THEN
   UPDATE SET AA.DS_ABN_CNT = BB.ABN_CNT
WHEN NOT MATCHED
THEN
   INSERT     (AA.DS_DATE, AA.DS_ABN_CNT)
       VALUES (BB.DET_DATE, BB.ABN_CNT)
EOD;
  
  $bRes = $this->db->simple_query($strQuery);
  
  return $bRes;
 }

또한 프로파일러를 켜도 실행된 쿼리가 없다고만 나와서요.. ㅠ_ㅠ)

그리고 컨트롤러에서는 저 함수를 단지 호출만 하고 있습니다.
milosz / 2013/05/28 15:43:17 / 추천 0
 음... 개행이 문제가 될 것 같진 않지만 일단 줄바꿈 없이 한줄로 변환하셔서 simple_query 대신 query로 해보시는건 어떨까요?