Q&A

  • 알수없는 SQL문 에러.... 흑~
with Datamod.QryTranSum do

begin

Close;

SQL.Clear;

SQL.Add('DELETE FROM trstatisticst12 ');

SQL.Add('where Trdate = 19991220);

ExecSQL;

end;



자꾸 SQL문법이 부적당하다고 하는데...



이유를 모르겠어요...



오라클DB를 쓰고 있구여... Trdate는 char(8)로... yyyymmdd형식의 데이타를



저장하고 있습니다...



trstatisticst12의 테이블에서... 날짜가 1999년 12월 20일날 저장된 데이타를



지우고 싶은데... 어떻게 하는 것이 좋으라여?!_!



4  COMMENTS
  • Profile
    ahnkh 1999.12.22 00:42
    with Datamod.QryTranSum do

    begin

    Close;

    SQL.Clear;

    SQL.Add('DELETE FROM trstatisticst12 ');

    SQL.Add('where Trdate = 19991220');

    ExecSQL;

    end;

    이며 Trdate 가 Char 형일 경우에는

    with Datamod.QryTranSum do

    begin

    Close;

    SQL.Clear;

    SQL.Add('DELETE FROM trstatisticst12 ');

    SQL.Add('where Trdate = ''19991220''');

    ExecSQL;

    end;

    로 하여 19991220 이 문자열이라는 것을 SQL에 표시하여야 합니다.

  • Profile
    신호성 1999.12.21 18:15
    김매경 wrote:

    > with Datamod.QryTranSum do

    > begin

    > Close;

    > SQL.Clear;

    > SQL.Add('DELETE FROM trstatisticst12 ');

    > SQL.Add('where Trdate = 19991220);

    > ExecSQL;

    > end;

    >

    > 자꾸 SQL문법이 부적당하다고 하는데...

    >

    > 이유를 모르겠어요...

    >

    > 오라클DB를 쓰고 있구여... Trdate는 char(8)로... yyyymmdd형식의 데이타를

    >

    > 저장하고 있습니다...

    >

    > trstatisticst12의 테이블에서... 날짜가 1999년 12월 20일날 저장된 데이타를

    >

    > 지우고 싶은데... 어떻게 하는 것이 좋으라여?!_!

    >





    WHERE 조건절이 잘못되었네요



    SQL.Add('where Trdate = 19991220);



    -> SQL.Add('WHERE TRDATE = :TRDATE');

    -> ParamByName('TRDATE').AsString := '19991220';





    직접 값을 대입하는것은 여러가지 문제의 소지가 있으며 좋지않은 습관입니다.

    물론 어쩔 수 없는 경우도 있지만.....

    파라미터를 사용하는것이 좋은 프로그래밍 습관이라 생각합니다.











  • Profile
    김상면 1999.12.21 00:46
    > ExecSQL;

    여기를 Open으로 바꾸세요....

    > SQL.Add('where Trdate = 19991220);

    요기는 Char Type 이라면 될 수 있으면 '19991220'으로 하시는 게 좋습니다...

    SQL은 요문장을 해석할 때 19991220을 숫자로 바꾸고 비교를 합니다...

    물론 에러는 없습니다...

    그러나 문제는, 만약 Trdate가 인데스 컬럼이라면 인덱스를 사용하지 않고

    전체 테이블 스캔을 합니다...

    자료가 많다면 인덱스를 사용하지 않아서 속도가 무지 느려 지겠죠...





    김매경 wrote:

    > with Datamod.QryTranSum do

    > begin

    > Close;

    > SQL.Clear;

    > SQL.Add('DELETE FROM trstatisticst12 ');

    > SQL.Add('where Trdate = 19991220);

    > ExecSQL;

    > end;

    >

    > 자꾸 SQL문법이 부적당하다고 하는데...

    >

    > 이유를 모르겠어요...

    >

    > 오라클DB를 쓰고 있구여... Trdate는 char(8)로... yyyymmdd형식의 데이타를

    >

    > 저장하고 있습니다...

    >

    > trstatisticst12의 테이블에서... 날짜가 1999년 12월 20일날 저장된 데이타를

    >

    > 지우고 싶은데... 어떻게 하는 것이 좋으라여?!_!

    >

  • Profile
    형호후배 1999.12.21 01:48
    혹시 SQL.Add('where Trdate = 19991220);

    이부분에서 마지막 따옴표(')를 빼먹으신거 아닌가요?

    그러니까 고치면 SQL.Add('where Trdate = 19991220');

    글구 ExecSQL를 Open으로 바꾸신다면 query속성에서 RequestLive 속성을 True로 해야됨니다. 그러니까 제 생각에는 따옴표 같은데요..





    김상면 wrote:

    > > ExecSQL;

    > 여기를 Open으로 바꾸세요....

    > > SQL.Add('where Trdate = 19991220);

    > 요기는 Char Type 이라면 될 수 있으면 '19991220'으로 하시는 게 좋습니다...

    > SQL은 요문장을 해석할 때 19991220을 숫자로 바꾸고 비교를 합니다...

    > 물론 에러는 없습니다...

    > 그러나 문제는, 만약 Trdate가 인데스 컬럼이라면 인덱스를 사용하지 않고

    > 전체 테이블 스캔을 합니다...

    > 자료가 많다면 인덱스를 사용하지 않아서 속도가 무지 느려 지겠죠...

    >

    >

    > 김매경 wrote:

    > > with Datamod.QryTranSum do

    > > begin

    > > Close;

    > > SQL.Clear;

    > > SQL.Add('DELETE FROM trstatisticst12 ');

    > > SQL.Add('where Trdate = 19991220);

    > > ExecSQL;

    > > end;

    > >

    > > 자꾸 SQL문법이 부적당하다고 하는데...

    > >

    > > 이유를 모르겠어요...

    > >

    > > 오라클DB를 쓰고 있구여... Trdate는 char(8)로... yyyymmdd형식의 데이타를

    > >

    > > 저장하고 있습니다...

    > >

    > > trstatisticst12의 테이블에서... 날짜가 1999년 12월 20일날 저장된 데이타를

    > >

    > > 지우고 싶은데... 어떻게 하는 것이 좋으라여?!_!

    > >