コンテンツフレーム起動

ネイティブ SQL 文書を SAP ライブラリストラクチャに組み込む

オープン SQL を使用すると、お使いの R/3 システムで使用しているデータベースプラットフォームに関係なく、ABAP ディクショナリ内で宣言したデータベーステーブルへアクセスすることができます。ネイティブ SQL を使えば、データベース固有の SQL 文を ABAP プログラムで使用することができます。つまり、ABAP ディクショナリで管理されないデータベーステーブルを使用できるので、R/3 システムの一部ではないデータを統合することができます。

原則としてデータベース固有の SQL 文を含む ABAP プログラムは、異なるデータベースシステムでは実行 されません。プログラムを複数のデータベースプラットフォームで使用する場合は、オープン SQL 文のみを使用してください。

ABAP プログラムでのネイティブ SQL

ネイティブ SQL 文を使用するには、次のように EXEC SQL 文を前に置き、ENDEXEC 文を後ろに置く必要があります。

EXEC SQL [PERFORMING <form>].
   <Native SQL statement>
ENDEXEC.

ネイティブ SQL 文の後ろに終止符は付けません。また、ネイティブ SQL 文内の行頭に引用符 (“) やアスタリスク (*) を使用しても、通常の ABAP 構文のようにコメントを挿入することはできません。選択したデータベースではテーブルや項目名が、大文字/小文字を区別するかどうか確認する必要があります。

ネイティブ SQL 文では、データはホスト変数を使用してデータベーステーブルと ABAP プログラムの間で移送されます。これらは ABAP プログラム内で宣言され、コロン (:) によってネイティブ SQL 文の前に置かれます。基本構造をホスト変数として使用することができます。例外として、INTO 句内の構造はそのすべての項目が個別にリストアップされたかのように扱われます。

ネイティブ SQL SELECT 命令内での選択がテーブルの場合は、PERFORMING 追加を使用して行単位で ABAP に渡すことができます。プログラムによってサブルーチン <form> が、読み込まれる各行に対して呼び出されます。データはサブルーチン内でさらに処理することができます。

オープン SQL と同様に、ENDEXEC 文の後ろに、処理された行数が SY-DBCNT に入ります。ほぼすべての場合、SY-SUBRC には ENDEXEC 文の後ろに値 0 が入ります。カーソル操作では例外が発生します。FETCH に続く SY-SUBRC が、レコードの読込がそれ以上できない場合、4 になります。これは、EXEC SQL PERFORMING を使用して結果セットを読み込む場合にも当てはまります。

例

REPORT demo_native_sql.

DATA: BEGIN OF wa,
        connid   TYPE spfli-connid,
        cityfrom TYPE spfli-cityfrom,
        cityto   TYPE spfli-cityto,
      END OF wa.

DATA c1 TYPE spfli-carrid VALUE 'LH'.

EXEC SQL PERFORMING loop_output.
  SELECT connid, cityfrom, cityto
  INTO   :wa
  FROM   spfli
  WHERE  carrid = :c1
ENDEXEC.

FORM loop_output.
  WRITE: / wa-connid, wa-cityfrom, wa-cityto.
ENDFORM.

次のような情報が表示されます。

このグラフィックは添付のテキストに説明されています 

ネイティブ SQL SELECT 命令では、作業領域 WA および項目 C1 が使用されます。WA は、選択データが書き込まれるターゲット領域です。INTO 句内の構造 WA は、そのすべてのコンポーネントが個別にリストアップされたかのように扱われます。INTO :WA-CONNID, :WA-CITYFROM, :WA-CITYTO.C1 は、WHERE 句で使用されます。サブルーチン LOOP_OUTPUT によって、データが WA から画面に書き込まれます。

ネイティブ SQL の範囲

ネイティブ SQL を使えば、SQL プログラムインタフェース (通常 SQL コールインタフェースなどと呼ばれます) を通して利用可能な、SQL プログラムコードを (EXEC IMMEDIATE などのコマンドを使って) 直接実行するための (ほとんど) すべての命令を実行することができます。以降のセクションでは、サポートされていない命令をリストアップしています。

ネイティブ SQL およびデータベースインタフェース

ネイティブ SQL 文は、R/3 データベースインタフェースをバイパスします。テーブルのログ記録も、アプリケーションサーバ上のデータベースバッファとの同期化も行われません。このため、ABAP ディクショナリで宣言したデータベーステーブルの変更には、できる限りオープン SQL を使用してください。特に LCHR LRAW などのタイプの長い列を含む、ABAP ディクショナリで宣言したテーブルは、その列に余分なデータベース固有の列の長さ情報が含まれているので、オープン SQL を使用してアドレスする必要があります。ネイティブ SQL はこの情報を考慮に入れないので、正しくない結果を生み出す可能性があります。また、ネイティブ SQL は自動クライアント処理をサポートしていません。そのため、クライアント項目を他と同様に扱わなければなりません。

ネイティブ SQL とトランザクション

R/3 システム内のトランザクションの一貫性を確保するため、トランザクション管理命令 (COMMITROLLBACK WORK) や、ネイティブ SQL を使ってトランザクションパラメータを設定する命令 (isolation level...) は使用しないでください。

ストアドプロシージャ

さまざまなデータベース製品の固有の構文を標準化するため、ABAP には統一構文があります。

EXECUTE PROCEDURE <name> ( <parameter list> )

それぞれのパラメータは、カンマで区切られます。またパラメータが入力用 (IN)、出力用 (OUT)、または入出力用 (INOUT) のいずれであるかを指定する必要があります。追加情報については、SAP ノート 44977 を参照してください。

例

EXEC SQL
   EXECUTE PROCEDURE proc1 ( IN :x, OUT :y )
ENDEXEC.

カーソル処理

ネイティブ SQL でのカーソル処理は、オープン SQL での処理と似ています。

        OPEN <cursor name> FOR <statement>

        FETCH NEXT <cursor name> INTO <target(s)>.

        CLOSE <cursor name>

例

EXEC SQL
  OPEN c1 FOR
    SELECT client, arg1, arg2 FROM table_001
     WHERE client = '000' AND arg2 = :arg2
ENDEXEC.
DO.
  EXEC SQL.

     FETCH NEXT c1 INTO :wa-client, :wa-arg1, :wa-arg2
  ENDEXEC.

   IF sy-subrc <> 0.
    EXIT.

   ELSE.
     <verarbeite Daten>
  ENDIF.
ENDDO.
EXEC SQL.

   CLOSE c1
ENDEXEC.

この例ではカーソルを開いてデータを行ごとに読み込み、再度カーソルを閉じます。オープン SQL の場合と同様に、SY-SUBRC によって行が読込可能かどうか示されます。

データ型とデータ変換

ネイティブ SQL を使用してできることは以下のとおりです。

        ABAP 項目からデータベースへの値の転送

        データベースからのデータの読込と、ABAP プログラムでの処理

ネイティブ SQL は、ABAP ディクショナリに格納されたデータベーステーブルに関する管理データがなくても機能します。そのため、オープン SQL では行われる整合性チェックをすべて実行することはできません。したがって、正しいタイプの ABAP 項目で作業するという重い責任が、アプリケーション開発者にかかります。ABAP のデータ型と、データベース列のタイプが必ず同じになるようにしてください。

データベーステーブルが ABAP ディクショナリで定義されていない場合、そのデータ型を直接参照することはできません。その場合は、統一タイプのテキストを ABAP ディクショナリに登録し、すべてのアプリケーションプログラムで使用できるようにしてください。

ABAP ディクショナリでテーブルが定義されている場合、ABAP ディクショナリ内の項目の順序が、データベース内の項目の実際の順序と同一ではない可能性があることを憶えておいてください。SELECT 句にアスタリスク (*) を使用してすべての列を対応する作業領域に読み込もうとしても、無意味な結果になります。最悪の場合、エラーが発生します。

データベースインタフェースのネイティブ SQL モジュールによって、使用される ABAP 項目のタイプ、サイズおよびメモリロケーションのテキストが、データベースシステムに渡されます。通常は該当するデータベースシステム操作を使用して、データへのアクセスと変換が行われます。これらの操作の詳細は、該当のデータベースシステムのプログラムインタフェース用マニュアルで見ることができます。場合によっては、ネイティブ SQL によってその他の互換チェックも実行されます。

ABAP の項目値をデータベーステーブルに格納するため (INSERT, UPDATE)、およびデータベースコンテンツを項目に読み込むため (SELECT) の、ABAP のデータ型とデータベース列のタイプの組み合わせの詳細な一覧が、各データベース製造業者から出されている文書に掲載されています。また、これらのテキストをデータベース処理の入力用および出力用パラメータに適用することもできます。その一覧に掲載されていない組み合わせは定義されていないものなので、使用しないでください。

以下のセクションでは、個々のデータベースに対するデータのタイプと変換の詳細について説明します。データのタイプと変換は、データベース固有のものですが、共通の仕様もいくつかあります。

推奨する組み合わせのタイプを下線で示しています。リリース間で特性が保証されているのは、これらの組み合わせだけです。それ以外の組み合わせについては、指定されたリリースに対してのみ説明が適用されると考えてください。

変換の結果は、以下のように結果列に表示されます。

        OK: 変換はデータ損失なしに実行できます。

        失敗に終わる操作は、それらのSQL エラーコードで示されます。この種のエラーは常に、プログラム強制終了および ABAP のショートダンプにつながります。

        場合によっては、SQL エラーが発生せずにデータが転送されることもあります。しかしそのデータは、途中で切れ捨てられていたり、丸められていたりするか、さもなければ使い物になりません。

        [rtrunc]: 右端が切り捨てられています。
「左」または「右」は、値を書き込む通常の方法に適用されます。したがってたとえば、ある数字が途中で切り捨てられている場合、小数点以下桁数に影響します。

        [rtrunc]: 左端が切り捨てられています。

        [round]: 変換中に切り上げまたは切り捨てられました。

        [0]: 数が「小さすぎた」ため、0 に丸められました (アンダフロー)

        [undef]: 変換結果が定義されていません。
考えられる結果がいくつかあります。具体的な結果はまったく不明か、または複雑すぎて実用的でないルールセットを使用しないと説明できないかのいずれかです。

        [null]: 変換によって SQL NULL が返されました。

        [ok]: 変換は項目なしに実行され、チェックされません。
元データは変換されますが、その書式はチェックされません。したがって、結果は結果タイプに対して無効な値となる可能性があり、その場合はさらに処理することはできません。この一例としては、変換後に値「99999999」または「abcdefgh」が含まれる日付項目です。

ABAP のデータ型とデータベースの列タイプの組み合わせは、さらに細かいサブカテゴリに分類されます。ここで、たとえば転送方向 ABAP データベース (INSERT, UPDATE) を使用すると、

        ABAP 項目の幅がデータベース列の幅より広い場合、ABAP 項目に、データベース列には十分なスペースがない値が含まれる可能性があります。ここでさらに別なケースが考えられます。ABAP 内の実際のデータ値が入るスペースが、データベース列内にあるかないかということです。

        ABAP 項目の長さが最大でもデータベース列と同じであれば、データベース列には必ず ABAP 値用のスペースがあります。

        数値列などのタイプは、特定の書式による値を期待します。これはたとえば、整数列に ABAP 文字項目 (タイプ C) を書き込む場合など、文字タイプとの関連では特に重要です。

Oracle 用ネイティブ SQL

Informix 用ネイティブ SQL

DB2 Common Server 用ネイティブ SQL

 

 

 

コンテンツフレーム終了