1. 程式人生 > >使用abap向資料庫直接寫入資料

使用abap向資料庫直接寫入資料

Starting the Connection

EXEC SQL.
  CONNECT TO dbs [AS con]
ENDEXEC.
連線到DBS並將其置為當前連線,其後所有的SQL命令都通過其執行。如果到DBS的連線已經存在,複用此連線,否則新建連線。

DBS可以是個字串或host variable(變數值是表DBCON列CON_NAME內容),DBS資訊必須在表DBCON內已維護。

使用AS選項,為連線分配一個名稱。CON可是字串或字元型host variable。便可通過此名稱使用連線。

Choosing the Connection
EXEC SQL.
  SET CONNECTION{con|DEFAULT}
ENDEXEC.
設定當前連線。可以是DBCON列CON_NAME值,或建連線用的con

DEFAULT:到當前SAP系統的central database system

Determining the Connection
EXEC SQL.
  GET CONNECTION:con
ENDEXEC.
獲得連線名稱,如果連線有名稱,此名稱分配給con.如果沒有名稱,DBCON列CON_NAME值分配給con,如果當前連線是到central database of the ABAP-based SAP system,con ="DEFAULT".
Closing the Connection
EXEC SQL.
  DISCONNECT con
ENDEXEC.
如果con 不是當前連線,沒有影響,如果是當前連線,同時將the standard connection to the central database of the ABAP-based SAPsystem 設為當前連線。

連線有名稱,必須使用名稱,如果沒有名稱才可以使用DBCON列CON_NAME值。不能使用"DEFAULT"

例,開啟一個連線,將SCARR內容匯入。

*資料庫連線

PARAMETERS dbs TYPE dbcon-con_name.
DATA carrid_wa TYPE scarr-carrid.
*資料庫系統型別
DATA dbtype TYPE dbcon_dbms.
SELECT SINGLE dbms
       FROM dbcon
       INTO dbtype
       WHERE con_name = dbs.

*判斷資料庫型別
IF dbtype = 'ORA'.
  TRY.
      EXEC SQL.
CONNECTTO :dbs
      ENDEXEC.

*建立連線異常
      IF sy-subrc<> 0.
       
RAISE EXCEPTION TYPEcx_sy_native_sql_error.
      ENDIF.

*執行SQL      EXEC SQL.
        OPEN dbcur FOR   SELECT carrid  FROM scarr
      ENDEXEC.
      DO.
        EXEC SQL.
          FETCH NEXT dbcur INTO:carrid_wa
        ENDEXEC.
        IF sy-subrc <> 0.
          EXIT.
        ELSE.
          WRITE / carrid_wa.
        ENDIF.
      ENDDO.

*關閉遊標
      EXEC SQL.
CLOSEdbcur
      ENDEXEC.

*關閉連線
      EXEC SQL.
        DISCONNECT :dbs
      ENDEXEC.

*異常處理
    CATCH cx_sy_native_sql_error.
      MESSAGE `Error in Native SQL.` TYPE'I'.
  ENDTRY.
ENDIF.
In , similar statements for reading data using a as in can be specified.

EXEC SQL.
 OPEN dbcur FORSELECT ...
ENDEXEC.

開啟遊標dbcur. For dbcur, a flatcharacter-type can be specifried.
EXEC SQL.
  FETCH NEXT dbcur INTO ...
ENDEXEC.

讀取遊標資料。如果沒到資料,sy-subrc =4.

sy-dbcnt=已讀過的條數。

EXEC SQL.
  CLOSE dbcur
ENDEXEC.
關閉遊標

執行過程

EXEC SQL.
  EXECUTE PROCEDURE proc ( IN    p_in1   IN    p_in2 ...,
                           OUT   p_out1  OUT   p_out2 ...,
                           INOUT p_inout1 INOUTp_inout2 ... )
ENDEXEC.


In database systems, you can define procedures as so-called "storedprocedures". Since the syntax for calling such procedures and thepertinent parameter transfer for various database systems can vary widely, auniform command exists in .

The statement EXECUTE PROCEDURE calls a procedure proc storedin the database. For all formal parameters of the procedure, you must specifythe actual parameters, separated by commas. You must specify IN, OUT or INOUT before every actual parameter, in order toindicate whether the parameter is an input, output, or input/output parameter.You can use literals or labeled by a colon(:)for the actual parameters.

Example

This example defines a selfuncprocedure using database specific SQL-Statements (Informix). It also calls theprocedure using the SAP-specific Native-SQL-Statement EXECUTEPROCEDURE in a LOOP-loop bymeans of a , and deletes thethe procedure using an SQL-Statement. In the case shown here, the procedure isa function whose return value output in EXECUTEPROCEDURE is copied to the hostvariable name.

DATA scarr_carrid TYPE scarr-carrid.
SELECT-OPTIONS s_carrid FOR scarr_carrid NO INTERVALS.
DATA s_carrid_wa LIKE LINE OF s_carrid.

DATA name TYPE c LENGTH 20.

TRY.
    EXEC SQL.
      CREATE FUNCTION selfunc( inputCHAR(3) )
        RETURNING char(20);
        DEFINE output char(20);
        SELECT carrname
               INTO output
               FROM scarr
               WHERE mandt  = '000' AND
                     carrid = input;
        RETURN output;
        END FUNCTION;
    ENDEXEC.
    LOOP AT s_carrid INTO s_carrid_wa
                     WHERE sign = 'I' ANDoption = 'EQ'.
      TRY.
         EXEC SQL.
            EXECUTE PROCEDURE selfunc(IN  :s_carrid_wa-low,
                                      OUT :name )
          ENDEXEC.
          WRITE: / s_carrid_wa-low, name.
        CATCH cx_sy_native_sql_error.
          MESSAGE `Error in procedureexecution` TYPE 'I'.
      ENDTRY.
    ENDLOOP.
    EXEC SQL.
      DROP FUNCTION selfunc;
    ENDEXEC.
  CATCH cx_sy_native_sql_error.
    MESSAGE `Error in procedure handling`TYPE 'I'.
ENDTRY.