Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[7671] Re:[질문]파라독스에서 select 한 필드로 Create Table 하기...
박정모 [] 1497 읽음    2001-11-27 10:59


예, 아래 임프님께서 말씀 하셨듯이 BDE의 SQL로는 님이 원하는 결과를 얻을수
없습니다.

하지만 아주 방법이 없는 것은 아닙니다.

님께서 원하는시는 쿼리의 결과로 새 Table을 만드는 것을 실제로 DB engine은
어떻게 실행할까요? 아마도 아래와 비슷할거라고 생각됩니다.

1. Query를 실행하고 그 결과를 임시테이블에 저장한다.
2. "새Table명"의 이름으로 임시테이블과 형식이 똑같은 테이블을 만든다.
3. 임시테이블의 내용을 새Table에 복사한다.

BDE SQL은 아쉽게도 1의 과정만 해주고 2, 3은 해주지 않는데요, 이 부분을
직접 구현할 수 있는 방법을 델파이가 제공해주고 있습니다. 그 방법은 아래와
같습니다.

1. 쿼리 결과를 저장하고 있는 임시테이블과 구조가 동일한 테이블을 내가
   원하는 위치에 직접생성한다. ( 데모 함수는 아래에서 보이겠습니다. )
2. TBatchMove를 이용해서 쿼리의 내용을 생성한 Table에 복사한다.

결과적으로 SQL이 해줘야할 일을 프로그래머가 직접해줘야 합니다. 하지만,
그걸 일일이 코딩해야 할까 걱정하지는 마십시요. 그 코딩부분은 의외로 간단
하고 또, 제가 작성해논 함수가 있으니까요.

---------------------------------------------------------------------------------------
Table의 구조를 복사해주는 함수.

procedure CopyTableFields( poSource, poDest : TDataSet );
var
  i : Integer;
begin
  with poDest do
  begin
     Close;
     FieldDefs.Assign( poSource.FieldDefs );
     CreateTable;

     for i := 0 to FieldCount - 1 do
        Fields[ i ].ReadOnly := FALSE;
  end;
end;

이 함수는 제가 예전에 만들어 두었던걸 그대로 올린건데... 몇개의 똑같은 함수들중에
제대로 되는것이 어느건지 몰라서... ㅠㅠ;; 그중에 가장 알맞다고 생각되는 함수를 올린
거니까... ㅠㅠ;; 아마도 테스트를 하셔야 할것 같습니다.
---------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------
TBatchMove를 사용하는 예제

  // Query실행
     TQry.Active   := FALSE;
     TQry.SQL.Text := SQL;
     TQry.Open;

  // Query된 내용을 BatchMove
     TempTable.Active    := FALSE;
     TempTable.Exclusive := FALSE;
     TempTable.TableName := PrivateDir + '\Temp.DB';
     TempTable.EmptyTable;

     BatchMove1.Source      := TQry;
     BatchMove1.Destination := TempTable;
     BatchMove1.Execute;

     TQry.Active := FALSE;

  // Table을 사용준비한다.
     TempTable.Active := TRUE;
     Self.DataSource.DataSet := TempTable;
  end;

이 함수 역시 테스트는... ㅠㅠa 지송여...
---------------------------------------------------------------------------------------

하지만, 이렇게 해서 얻는 이점이 무엇일까요?
아무리 별것 아닌 코딩이지만 프로그래머가 직접 복잡한 기능을 만들어야 한단건
분명 부담스런일 입니다.

저의 경우에 위와 같은 작업을 해준이유는 서브쿼리가 안되기 때문이 아닙니다.
그것은 쿼리된 결과값에 직접 Index를 주기위해서 입니다.

위의 코드를 보시면 알겠지만 테이블을 프로그래머가 직접 생성할 수 있기 때문에
그 테이블에 Index를 걸 수도 있습니다. 결과 테이블에 인덱스를 걸어서 사용자에게
빠른 검색을 제공할 목적으로 이런 방법을 생각해 내었는데요, 또하나의 이득이
있다면 결과내 검색을 제공할 수 있단것 입니다. ( 이 역시도 다른 SQL에서는
그냥 할 수 있는 일이죠.. ㅠㅠ ).

BDE도 제법 쓸만한 DB 인데 고놈의 SQL이 늘 말썽입니다.
쿼리가 시원찮은 대신에 프로그래머에게 제법 많은 유연성을 제공하고 있어서 속도를
개선할 여지가 많습니다.

BDE는 Table 수준의 DB입니다. DBMS/RDBMS가 아니죠. Table수준의 DB는 빠르지만 많은
유용한 기능들이 부족한것이 일반적입니다. 작고 빠른 BDE의 이런 저런 확장은 프로그래
머의 몫이라서 쓰기에 부담스럽지만, 위에서 보인것과 같이 확장이 생각만큼 어려운
것은 아닌것 같습니다.

MySQL은 제법 좋은 성능을 제공하기는 하지만, RDBMS로서의 성능이 떨어지는 것으로
알고 있습니다. 그러니까 MySQL역시 Table수준의 DB 이고, RDBMS 를 지원하지 않기
때문에 속도가 좋은것 같습니다.

휴..... 얼마 안되는 지식으로 어려운걸 설명하려니 머리가 빠질려고 그러네요.. ㅠㅠ;;
항상 기쁨이 님과 함께 하길 빌겠습니다.

ps : 위에 코드 안되면 다시 질문을.... ㅠㅠa

EzyRyder 님이 쓰신 글 :
:
:
: 안녕하세요?
: 이미 생성된 테이블들이 있고 그 테이블들을 조인해서 select 한뒤
: 다시 그 결과를 가지고 새로운table을 만들려고 합니다.
: 그런데 좀처럼 sql문이 실행이 안되는군요..
: 제가 한방법은
: CREATE TABLE 새table명 AS (select  fiel1, field2, field3....where ...)
: 이렇게 사용하니 에러가 나더군요..
: 어떻게 해야할지..sql문법을 잘아시는 분들의 조언을 구합니다.
: 저는 델파이 5에서 파라독스를 사용중입니다.
: 어떤분은 파라독스에서는 안된다고 하시던데...
: 파라독스가 편하구 좋은데..이런게 제약이 있나보군요....


+ -

관련 글 리스트
7668 [질문]파라독스에서 select 한 필드로 Create Table 하기... EzyRyder 721 2001/11/26
7671     Re:[질문]파라독스에서 select 한 필드로 Create Table 하기... 박정모 1497 2001/11/27
7669     Re:[질문]파라독스에서 select 한 필드로 Create Table 하기... 박지훈.임프 818 2001/11/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.