본문 바로가기
ERP-SAP/ABAP

<ABAP> NATIVE SQL로 DB UPDATE 하기 (INTERFACE 할 시에..)

by 행복한워니의 기록 2012. 8. 14.
728x90
반응형

가끔 INTERFACE 프로젝트에 들어오면 (가끔... 일까?-_- 난 왜 맨날 인터페이스만...)

 

다른쪽 ORACLE DB에 우리 SAP 데이터를 꼽아줘야 할 때가 있다...

 

사실 시노니움을 맺어서 OPEN SQL로 그냥 처리하면(마치 SAP 에 DB가 있듯이.. 똑!! 같!! 이.. 하면 된다만..)

 

금방 끝나지만.....

 

모르겠따.. 이것도 DB 관리자 및 저쪽편 DB관리자에게 서로 쇼당을 봐야 하는 일이니...

 

그냥 던져주면 던져주는대로 하는 수 밖에...

 

우선 INTERFACE 시에 상대편 DB 컨넥트를 해준다.

 

소스는 하기와 같다... (컨넥트 보단 테스트??)

 

 

컨넥트 관련 선언문.. 뭐 오류같은거 잡아오는거 뿐..

 

    DATA : lcl_open_sql TYPE REF TO cx_sy_open_sql_db,
         lv_open_err TYPE string,
         lcl_native_sql  TYPE  REF TO cx_sy_native_sql_error,
         lv_native_err TYPE string.

 

 

 

  **--------------------------------------------------------------------*
** DB CONNECTION
**--------------------------------------------------------------------*
  PERFORM dbco_connection CHANGING lv_native_err.

 

 

위 소스는 아래....

*--------------------------------------------------------------------*
* DBCI CONNECTION
*--------------------------------------------------------------------*
FORM dbco_connection CHANGING error_text TYPE string.
  DATA : exc_ref     TYPE  REF TO cx_sy_native_sql_error.

  TRY.
      EXEC SQL .
        CONNECT TO 'GXIX'  <- SAP와 웹DB 간에 서로 연결되는 Destination 명이 GXIX 란다.
      ENDEXEC.             <- 위 내용은 sap db관리자와 oracle db 관리자가 생성해준다.
    CATCH cx_sy_native_sql_error INTO exc_ref.
      error_text exc_ref->get_text).
  ENDTRY.

ENDFORM.                    "DBCO_CONNECTION

 

 

이렇게 체크해보면 GXIX에 연결되는지.. 알 수 있다.

 

이상없이 되었다면.. 본격적인 NATIVE SQL 쿼리를 날려보자

 

  *--------------------------------------------------------------------*
* INSERT LOGIC
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
* 646 transfer
*--------------------------------------------------------------------*
  CLEAR : lS_ht646_1.
  LOOP AT lt_ht646_1 INTO lS_ht646_1.  "EXPORT DATA
    TRY.
        EXEC SQL.     "아래는 GXIX.상대편DB명 으로 쓰여있는거다.
          INSERT INTO GXIX.IF_RCV_QUOTATION_HEADER_I (
           ZQTNR,
           ZITNR,
           ZVSNR,
           VV800,
           VV200,
           VV500,
           VV700,
           ZAWCAUSE,
           ZATCAUSE
          )
          VALUES(
           :lS_ht646_1-ZQTNR,
           :lS_ht646_1-ZITNR,
           :lS_ht646_1-ZVSNR,
           :lS_ht646_1-VV800,
           :lS_ht646_1-VV200,
           :lS_ht646_1-VV500,
           :lS_ht646_1-VV700,
           :lS_ht646_1-ZAWCAUSE,
           :lS_ht646_1-ZATCAUSE
          )
        ENDEXEC.
      CATCH cx_sy_native_sql_error INTO lcl_native_sql.
        lv_native_err lcl_native_sql->get_text).
        e_subrc 1.
        e_messg text-m02 && lv_native_err.
        ROLLBACK WORK.
        PERFORM dbco_rollback(zmmhc002CHANGING lv_native_err.
        EXIT.
    ENDTRY.
  ENDLOOP.

 

*--------------------------------------------------------------------*
* DBCO COMMIT
*--------------------------------------------------------------------*
FORM DBCO_ROLLBACK CHANGING ERROR_TEXT TYPE STRING.
DATA : exc_ref TYPE REF TO cx_sy_native_sql_error.

TRY.
EXEC SQL .
ROLLBACK
ENDEXEC.
CATCH cx_sy_native_sql_error INTO exc_ref.
error_text = exc_ref->get_text( ).
ENDTRY.
ENDFORM.

 

 

위와같이 제대로 실행이 안되었다면 ROLLBACK을 넣어준다.

 

그 후에

 

  *--------------------------------------------------------------------*
* Commit & Rollback
*--------------------------------------------------------------------*
  IF e_subrc EQ 0.  "제대로 실행되었다면 코밋을 해줘야 한다.
    COMMIT WORK.
    PERFORM dbco_commit CHANGING lv_native_err.
    PERFORM save_log_data_SEND.  "이건 회사마다 넣는 로그펑션이다. 니가 맹글어라.
    e_messg text-s01.
  ENDIF.

 

  *--------------------------------------------------------------------*
* DBCO COMMIT
*--------------------------------------------------------------------*
FORM dbco_commit CHANGING error_text TYPE string.
  DATA : exc_ref     TYPE  REF TO cx_sy_native_sql_error.

  TRY.
      EXEC SQL .
        COMMIT
      ENDEXEC.
    CATCH cx_sy_native_sql_error INTO exc_ref.
      error_text exc_ref->get_text).
  ENDTRY.
ENDFORM.                    "DBCO_COMMIT

 

 

 

자... 이제 GXIX 연결을 끊어야겠지.?

 

  *--------------------------------------------------------------------*
* CLOSING DB CONNECTION
*--------------------------------------------------------------------*
  PERFORM dbco_disconnect CHANGING lv_native_err.
*--------------------------------------------------------------------*

 

*--------------------------------------------------------------------*
* DBCO DISCONNECT
*--------------------------------------------------------------------*
FORM dbco_disconnect CHANGING error_text TYPE string.
  DATA : exc_ref     TYPE  REF TO cx_sy_native_sql_error.

  TRY.
      EXEC SQL .
        DISCONNECT 'GXIX'
      ENDEXEC.
    CATCH cx_sy_native_sql_error INTO exc_ref.
      error_text exc_ref->get_text).
  ENDTRY.
ENDFORM.                    "DBCO_DISCONNECT

 

 

이렇게 하면 NATIVE SQL INTERFACE가 끝났따... 상대편 DB에 우리 데이터를 넣어준거다..

 

이건 거의 TEMPLATE와 같이 활용되는 것이니.. 가지고 다니거나 그대로 카피해서 써도 된다..

 

상대편 DB명이랑 필드명은 당연히 바꿔야 된다-_-

 

DESTINATION 명도.......

 

 

이정도 써놨는데 이해를 못하고 버벅된다면....

 

그건 아직 ABAP의 이해도가 매우 떨어지는 상태이니.... 더더욱 열심히 남이 짜놓은 소스를 구경하거나

 

독학하며 익혀야 한다..... 자.. 나도 늘 열공하고 있다..

 

당신도.. 열공합시다..^^

 

 

728x90
반응형