Q&A

  • Rank() 함수쓰면 에러가...나네요.
현재 Delphi 7.0을 쓰고 있습니다.
개발 시작한지 몇달 안되는 초보입니다.

DBGrid를 쓰기땜에 SQLQuery 와 ClientDataSet을 사용하고 있습니다.
SQLQuery의 SQL String Editor에 쿼리를 넣구서 Open을 시키면 이상없이 작동을 합니다. 하지만, 소스코드에서 ClientDataSet을 실행시에 Open 시키면 Access Violation Error가 납니다.

  sql_select_pre :=
    ' SELECT TO_CHAR(i_page) i_page, TO_CHAR(i_prodline1) i_prodline1,' +
    '        TO_CHAR(i_prodline3) i_prodline3, s_prodlinename, s_description, ' +
    '        AVG_SellPrice, ' +
    '        GDQty, RANK() Over (ORDER BY GDQty DESC) GDQty_Rank,' +
GIP_IND,' +
    '        RTQty, RTVal, RTQty_Per, RTVal_Per ' ...

위 SQL문에서 RANK() 함수부분을 없애면 아무 문제없이 작동을 하는데 RANK()를 넣고 실행만 하면 에러가 나네요.
에러 메시지는 Access Violation ....in module 'midas.dll' .. 이 나는데..
구글에서 이런경우에 Uses문에 MidasLib를 넣으라는 부분이 있길래
추가를 했더니 한번 Access Violation ... in module '프로그램이름'... 으로 메시지가 바뀌어서 나오고 난 후에 다시 누르면 작동을 하기도 하고, 작동했다가 에러났다가를 반복합니다.

참고로, SQL String Editor에 SQL문을 박아놓구 ClientDataSet을 Open시킨상태에서는 DBGrid에 데이타가 이상없이 잘 나오네요.

오라클 함수를 안쓰자니 순위 매기는 부분을 만들어야 할것 같기도 하구...

이틀동안 이부분땜에 꼬박 보냈는데도..이유를 모르겠씁니다.

고수님들의 조언 부탁드립니다.
도와주세요.

감사합니다.

3  COMMENTS
  • Profile
    김경록 2003.10.04 01:49
    오라클 Analytic Funtion이 있는거 보니까..
    8i이상을 사용하시는 것 같군요..

    델파이에서 직접적인 SQL문 상으로 Analytic Function을
    사용할 수 있는 오라클 버젼은 9i부터입니다..
    따라서 9i미만 버젼에서는 직접적인 Analytic Function의
    호출은 불가능합니다..
    다만, Dynamic SQL문을 이용해서 사용은 가능합니다.
    결론적으로,
    3-tier이든 2-tier이든간에
    직접적인 SQL문에 Analytic Function을 사용하기 위해서는
    오라클 버젼은 9i이상이어야 한다는 뜻입니다..
    그렇지 않다면,
    무조건 Error!!!
    답이 되었다면 좋겠군여..




  • Profile
    김수현 2003.10.06 18:38
    친절한 답변 고맙습니다.
    전 델파이 7 버전이면 최신버전이라서 지원이 다 될 줄 알았는데,
    새로운 사실을 알게 되었네요.
    이것만으로도 큰 도움이 되는군요.

    그럼 다른 사람들은 그 이전 버전 (오라클 9i)에서는 어떻게 해결했었는지도 또 궁금하네요.
    순위 매기는 부분을 직접 코딩을 했는지...
    저한테는 쉽지 않은거 같은데...


  • Profile
    물고기나라 2003.10.07 20:07


    RANK() Over (ORDER BY GDQty DESC) GDQty_Rank

    쿼리문을 보니 이렇게 간단히 하는군요. 오라클 좋다 ^^;;

    답변해 주신분이 Dynamic SQL문을 이용하면 된다는데 자세한 내용이 없네요. 클~

    쿼리를 잘 아시분이라면 쿼리로 깔금하게 나올법도 한데 자료가 별로 없다면 원시적으로 순위 1,2,3....소트한걸 임시테이블에 집어 넣고 다시 원하는 조회를 하는건 어떨지 ^^;;;