Q&A

  • Query한 결과를 다른 테이블에 Insert 또는 Update???
안녕하세요?



Query한 결과를 입력화면 없이 바로 다른 테이블에 Insert 또는 Update 하는 방법을 알고 싶습니다.



참고로 지금 프로젝트를 하나 진행 중인데 '마감'처리 부분에서 필요한 기능이거든요..

3  COMMENTS
  • Profile
    .... 1999.09.21 03:49
    호 wrote:

    > 안녕하세요?

    >

    > Query한 결과를 입력화면 없이 바로 다른 테이블에 Insert 또는 Update 하는 방법을 알고 싶습니다.



    Oracle 기준입니다

    insert into 테이블명 (입력필드1, 입력필드2, ...., 입력필드n)

    select 입력필드1, 입력필드2, ..., 입력필드n



  • Profile
    이재식 1999.09.21 02:55
    호 wrote:

    > 안녕하세요?

    >

    > Query한 결과를 입력화면 없이 바로 다른 테이블에 Insert 또는 Update 하는 방법을 알고 싶습니다.

    >

    > 참고로 지금 프로젝트를 하나 진행 중인데 '마감'처리 부분에서 필요한 기능이거든요..



    이재식 wrote :

    안녕하세요. 쿼리를 던졌다면 결과셋이 쿼리 컴포넌트에 있겠죠.

    그런 그것을 다른 테이블에 Insert, or Update하는 방법은 의외로 쉽습니다.

    쿼리를 해서 결과를 가져왔다고 가정합시다.

    (그 결과는 Query1에 있다고 합시다, Query1에는 필드 A, B가 있다고 합시다)



    그럼 새로운 쿼리 컴포넌트가 필요해요. 이것을 Query2라고 합시다.

    Query2에는 필드 A,B가 있다고 합시다.

    with Not Query1.eof do

    begin

    with Query2 do

    begin

    Close ;

    SQL.Clear ;

    SQL.Add('Insert into 테이블이름 ') ;

    SQL.Add('values(:v1, :v2)') ;

    ParamByName('v1').asString := Query1.FieldByName('A').asString ;

    ParamByName('v2').asString := Query1.FieldByName('B').asString ;

    ExecSQL ;

    end ;

    Query1.Next ;

    end ;



    참고로, update는

    with Query2 do

    begin

    Close ;

    SQL.Clear ;

    SQL.Add('update 테이블이름') ;

    SQL.Add('where A = :v1, B = :v2') ;

    ParamByName('v1').asString := 위와동일 ;

    ParamByName('v2').asstring := 위와동일 ;

    ExecSQL ;

    end ;



    물론 DataBase 컴포넌트를 쓰셔서 트랜잭션 관리(시작, commit, rollback)를

    해 주셔야죠.



  • Profile
    이건영 2000.08.23 23:10
    안녕하십니까.. 귀하의 답변을 바탕으로 아래와 같이 코딩을 했습니다.

    부끄럽사옵니다만, 이제 겨우 프로그램 입문 3달째..

    이 문제에 거의 한달정도 해매고 있습니다. 계속 미루면서 다른거 해 왔었는데.. 이젠 이걸 해결 안하면 안될 정도에 몰렸습니다.



    코딩에는 문제가 없이 수행되나 정작 update가 안되고 있습니다.

    혹시 귀하의 설명대로 DataBase 컴포넌트를 써서 트랜잭션 관리(시작, commit, rollback)를 안해서 그런거 아닙니까? 학원에서 설명들을때 잘 이해가 안가더니.. 결국 이런데서 맛닥드리는군요..

    어떻게 하는지 설명 좀 부탁드립니다.





    procedure TForm1.Button4Click(Sender: TObject);

    begin

    Query2.Close;

    Query2.SQL.Clear;

    Query2.SQL.Add('select l.itemUP from booking b, Library l');

    Query2.SQL.Add('where b.bookitem = l.itemName');

    Query2.OpenDatabase;



    While Not Query2.Eof do //이렇게 쓰면 Query2가 끝이 아니면 계속 반복하라는 뜻은 이해하겠으나.. 처음부터 반복하라는 명령이 별도로 필요하지 않습니까? 안 그러면 데이타 수가 서로 맞지않아 error날 것 같은데..

    begin

    Query1.Close;

    Query1.SQL.Clear;

    Query1.SQL.Add('update booking set bookunitprice = :p1');

    Query1.ParamByName('p1').Value := Query2.FieldByName('l.itemUP').Value;

    Query1.ExecSQL;

    Query2.Next;

    end;

    end;





    이재식 wrote:

    > 호 wrote:

    > > 안녕하세요?

    > >

    > > Query한 결과를 입력화면 없이 바로 다른 테이블에 Insert 또는 Update 하는 방법을 알고 싶습니다.

    > >

    > > 참고로 지금 프로젝트를 하나 진행 중인데 '마감'처리 부분에서 필요한 기능이거든요..

    >

    > 이재식 wrote :

    > 안녕하세요. 쿼리를 던졌다면 결과셋이 쿼리 컴포넌트에 있겠죠.

    > 그런 그것을 다른 테이블에 Insert, or Update하는 방법은 의외로 쉽습니다.

    > 쿼리를 해서 결과를 가져왔다고 가정합시다.

    > (그 결과는 Query1에 있다고 합시다, Query1에는 필드 A, B가 있다고 합시다)

    >

    > 그럼 새로운 쿼리 컴포넌트가 필요해요. 이것을 Query2라고 합시다.

    > Query2에는 필드 A,B가 있다고 합시다.

    > with Not Query1.eof do

    > begin

    > with Query2 do

    > begin

    > Close ;

    > SQL.Clear ;

    > SQL.Add('Insert into 테이블이름 ') ;

    > SQL.Add('values(:v1, :v2)') ;

    > ParamByName('v1').asString := Query1.FieldByName('A').asString ;

    > ParamByName('v2').asString := Query1.FieldByName('B').asString ;

    > ExecSQL ;

    > end ;

    > Query1.Next ;

    > end ;

    >

    > 참고로, update는

    > with Query2 do

    > begin

    > Close ;

    > SQL.Clear ;

    > SQL.Add('update 테이블이름') ;

    > SQL.Add('where A = :v1, B = :v2') ;

    > ParamByName('v1').asString := 위와동일 ;

    > ParamByName('v2').asstring := 위와동일 ;

    > ExecSQL ;

    > end ;

    >

    > 물론 DataBase 컴포넌트를 쓰셔서 트랜잭션 관리(시작, commit, rollback)를

    > 해 주셔야죠.

    >