# テーブル書き込み処理

## オペレーション名

テーブル書き込み

## 機能概要

入力データをテーブルに書き込みます。

## データモデル

本コンポーネントのデータモデルはテーブルモデル型です。

## プロパティ

変数の使用については、「変数」を参照してください。

##### 基本設定

項目名 | 必須/省略可 | 変数の使用 | 説明 | 備考
--- | --- | --- | --- | ---
名前 | 必須 | 使用不可 | スクリプトキャンバス上での名前を入力します。 |
入力データ | 必須 | 使用不可 | スクリプトキャンバス上にあるコンポーネントを選択します。 |

##### 必須設定

項目名 | 必須/省略可 | 変数の使用 | 説明 | 備考
--- | --- | --- | --- | ---
接続先 | 必須 | 使用不可 | グローバルリソースを選択します。 [追加]: 新規にグローバルリソースを追加します。 [一覧の編集]: 「リソース一覧の編集」画面にて、グローバルリソースの設定を編集することができます。 |
テーブル名 | 必須 | 使用可 | 書き込むテーブルの名前を選択または入力します。 | グローバルリソースの一覧設定で指定した制限数のテーブルが表示されます。 データベース上のスキーマ名やテーブル名に「.」が含まれる場合、スキーマ名とテーブル名を引用符で囲むと正しく扱うことができます。 たとえば引用符が「"」の場合、スキーマ名が「A.B」で、テーブル名が「C.D」とすると、正しい引用符の囲み方は「"A.B"."C.D"」となります。
テーブル名を引用符で囲う | 省略可 | 使用不可 | 指定したテーブル名を引用符で囲うかどうかを選択します。 [チェックあり]: [テーブル名]に表示されているテーブル名を引用符で囲います。 [チェックなし]:(デフォルト) [テーブル名]に表示されているテーブル名を引用符で囲いません。 スペースなどの文字がテーブル名に含まれていた場合には、テーブル名を引用符で囲う必要があります。 引用符で囲う必要がある文字については、各データベースベンダーに問い合わせてください。 | 各データベースアダプタで設定されている引用符は以下の通りです。 Oracle、DB2、PostgreSQL:「""」(二重引用符) Access、SQL Server:「[]」(半角大括弧) JDBCアダプタとODBCアダプタには本プロパティはありません。 実行時には[テーブル名]に入力されたテーブル名をそのまま使用します。 [テーブル名]に入力されたテーブル名が引用符で囲われていた場合には、実行時にも引用符で囲まれたテーブル名でクエリーを発行します。 [テーブル名]に入力されたテーブル名が引用符で囲まれていない場合には、実行時に本プロパティの有効/無効を確認のうえ、本プロパティが有効であれば引用符で囲まれたテーブル名でクエリーを発行します。 [テーブル名]に環境変数を設定した場合、本プロパティの有効/無効を切り替えた際に値が展開されます。
キーの値と一致する行は更新 | 省略可 | 使用不可 | キーとして指定した列の値が一致する行の更新を行うか、全件挿入を行うかを選択します。 [チェックあり]: キー値が一致する行は更新します。キー値が一致しない行は挿入します。 [チェックなし]:(デフォルト) 全件挿入します。 | [キーの値と一致する行は更新]にチェックを入れ、[スキーマ定義]に[キー]が指定されていない場合には、エラーが発生します。 詳細については、「キーの値と一致する行は更新について」を参照してください。
スキーマ定義 | 必須 | - | [テーブル名]で指定したテーブルのスキーマ定義を表示します。 | [スキーマ定義]で表示された列の中で、[書き込み対象]または[キー]にチェックを入れた列名がMapperのスキーマに表示されます。 以下の場合はスキーマ定義を表示することはできません。 指定したテーブルに読み取り権限がない場合 指定したテーブルが存在しない場合 [テーブル名]に変数が指定されている場合 [テーブル名]が入力されていない場合 [テーブル名]でエラーが発生している場合
スキーマ定義/書き込み対象 | 省略可 | 使用不可 | [テーブル名]で指定したテーブルの各列を、書き込み対象カラムに含めるかどうかを選択します。 [チェックあり]:(デフォルト) 書き込み対象に含めます。 [チェックなし]: 書き込み対象に含めません。 | チェックを入れた列の列名がMapperのスキーマに表示されます。 ヘッダに表示されたチェックボックスを押下することで、一括操作を行うことができます。 1つ以上の列にチェックが入っている必要があります。 詳細については、「書き込み対象カラムについて」を参照してください。
スキーマ定義/キー | 必須 | 使用不可 | 更新条件に含めるキーを選択します。 [チェックあり]: 更新条件に含めます。 [チェックなし]:(デフォルト) 更新条件に含めません。 | [キーの値と一致する行は更新]にチェックを入れた場合、有効になります。 チェックを入れた列の列名がMapperのスキーマに表示されます。 [キーの値と一致する行は更新]にチェックを入れ、[スキーマ定義]に[キー]が指定されていない場合には、エラーが発生します。 詳細については、「キーの値と一致する行は更新について」を参照してください。
スキーマ定義/列名 | 必須 | 使用不可 | [テーブル名]で指定したテーブルの列名を表示します。 |
スキーマ定義/型 | 必須 | 使用不可 | [列名]の型を表示します。 | 「<Native型> (<内部データ型>)」形式で表示されます。 Native型: 各RDBMSの固有のデータ型です。 内部データ型: DataAnyware 2.0内部で使用しているデータ型です。 詳細については、「内部データ型」を参照してください。

###### プロパティアクション

項目名 | 説明 | 備考
--- | --- | ---
テーブルブラウザの起動 | テーブルブラウザを起動します。 操作方法については、「テーブルブラウザ」を参照してください。 | [接続先]が選択されている場合、有効になります。 [テーブル名]で指定したテーブルが初期表示されます。
スキーマ定義の更新 | [テーブル名]で指定したテーブルのスキーマ定義を更新します。 | 以下の場合には実行することができません。 指定したテーブルが存在しない場合 [テーブル名]に変数が指定されている場合 [テーブル名]が入力されていない場合 [テーブル名]でエラーが発生している場合

##### 書き込み設定

項目名 | 必須/省略可 | 変数の使用 | 説明 | 備考
--- | --- | --- | --- | ---
インサートモード | 省略可 | 使用不可 | データを全件挿入する場合の書き込み方式を選択します。 [1行インサート]:(デフォルト) 入力データの1行ごとにSQL文を実行します。 [バッチインサート]: [バッチサイズ]に指定した行数ごとにSQL文をバッチ更新します。 | 以下のアダプタには本プロパティはありません。 Accessアダプタ DB2アダプタ Oracleアダプタ PostgreSQLアダプタ SQL Serverアダプタ 本プロパティが存在しないアダプタの場合、[バッチインサート]で実行します。 [キーの値と一致する行は更新]にチェックを入れた場合、表示されません。 書き込む列の型にバッチ更新をサポートしない型が含まれている場合、[1行インサート]で実行します。 バッチ更新をサポートしない型については、「データベースアダプタの制限事項」を参照してください。 バッチ更新とは、複数行のデータを一度にデータベースに送信し、SQL文を実行する機能です。
アップデートモード | 省略可 | 使用不可 | データを更新する場合の書き込み方式を選択します。 [アップデート・インサート]:(デフォルト) 1行ごとにUPDATE文を実行し、キーの値と一致する行が存在しない場合はINSERT文を実行します。 [インサート・アップデート]: 1行ごとにINSERT文を実行し、キーの値と一致する行が存在する場合はUPDATE文を実行します。 [バッチアップデート・インサート]: [バッチサイズ]で指定した件数ごとにUPDATE文をバッチ更新し、キーの値と一致する行が存在しない場合はINSERT文をバッチ更新します。 | [キーの値と一致する行は更新]にチェックを入れた場合、表示されます。 [アップデート・インサート]と[インサート・アップデート]の違いについては、「「アップデート・インサート」と「インサート・アップデート」の違いについて」を参照してください。 データベースによっては使用できないアップデートモードがあります。使用できないアップデートモードについては、「データベースアダプタの制限事項」を参照してください。 書き込む列の型にバッチ更新をサポートしない型が含まれている場合、[アップデート・インサート]で実行します。 バッチ更新をサポートしない型については、「データベースアダプタの制限事項」を参照してください。 [インサート・アップデート]を指定した場合、[スキーマ定義/キー]で選択したカラムに、一意性制約が設定されている必要があります。 一意性制約が設定されていない場合は、[アップデート・インサート]または[バッチアップデート・インサート]を指定して実行してください。
バッチサイズ | 省略可 | 使用可 | バッチ更新するSQL文の件数を指定します。 | [インサートモード]で[バッチインサート]を選択した場合および、[アップデートモード]で[バッチアップデート・インサート]を選択した場合、有効になります。 デフォルト値は「1000」で、省略した場合は「1000」が設定されます。 入力できる値は「1〜2147483647」です。
クエリタイムアウトを有効にする | 必須 | 使用不可 | クエリタイムアウトを有効にするかどうかを選択します。 [チェックあり]: クエリタイムアウトを設定します。 [チェックなし]:(デフォルト) クエリタイムアウトを設定しません。 | [チェックなし]とした場合、JDBCドライバのクエリタイムアウトを指定しない場合の動作にしたがいます。 以下のアダプタには本プロパティはありません。 Accessアダプタ
クエリタイムアウト(秒) | 必須 | 使用可 | クエリタイムアウトを設定します。 | [クエリタイムアウトを有効にする]を[チェックあり]とした場合、有効になります。 入力できる値は「0〜2147483647」です。 本プロパティで入力した値は、JDBCのsetQueryTimeout()メソッドの引数に指定されます。 一般的に、クエリタイムアウトは実行を待つ秒数を設定しますが、データベースや使用するJDBCドライバによって動作が異なる場合があります。 以下のアダプタには本プロパティはありません。 Accessアダプタ

##### コメント

項目名 | 必須/省略可 | 変数の使用 | 説明 | 備考
--- | --- | --- | --- | ---
コメント | 省略可 | 使用不可 | このアダプタの簡単な説明を記述することができます。 説明を記述すると、仕様書に反映させることができます。 |

## スキーマ

### 入力スキーマ

[スキーマ定義]の設定により、カラム数が異なります。
スキーマ構造については、「テーブルモデル型のスキーマ」を参照してください。

### 出力スキーマ

ありません。

### Mapperでのスキーマ読み込み

スキーマは自動で読み込まれます。
詳細については、「スキーマ編集」を参照してください。

## トランザクション

トランザクションをサポートしています。

## PSPでの使用について

PSPで使用できます。
PSPについては、「パラレルストリーミング処理」を参照してください。

## 使用できるコンポーネント変数

コンポーネント変数名 | 説明 | 備考
--- | --- | ---
count | 書き込んだデータの件数が格納されます。 | デフォルト値はnullです。
insert_count | 書き込んだデータのうち、挿入したデータの件数が格納されます。 | デフォルト値はnullです。
update_count | 書き込んだデータのうち、更新したデータの件数が格納されます。 | デフォルト値はnullです。
error_code | エラー(SQLException)発生時、発生したエラーに対応するエラーコードが格納されます。 | デフォルト値はnullです。 正常終了時は「0」が格納されます。 エラーコードは各ドライバの仕様に基づいています。
message_category | エラー発生時、発生したエラーに対応するメッセージコードのカテゴリが格納されます。 | デフォルト値はnullです。
message_code | エラー発生時、発生したエラーに対応するメッセージコードのコードが格納されます。 | デフォルト値はnullです。
message_level | エラー発生時、発生したエラーに対応するメッセージコードの重要度が格納されます。 | デフォルト値はnullです。
error_type | エラー発生時、発生したエラーの種類が格納されます。 | デフォルト値はnullです。 エラーの種類は、以下のような形式となります。 例:「java.io.FileNotFoundException」 CustomerVision DataAnyware 2.0のバージョンにより、格納される内容が変わる可能性があります。
error_message | エラー発生時、発生したエラーのメッセージが格納されます。 | デフォルト値はnullです。 CustomerVision DataAnyware 2.0のバージョンにより、格納される内容が変わる可能性があります。
error_trace | エラー発生時、発生したエラーのトレース情報が格納されます。 | デフォルト値はnullです。 CustomerVision DataAnyware 2.0のバージョンや実行するクライアントアプリケーションにより、格納される内容が変わる可能性があります。

## キーの値と一致する行は更新について

テーブル書き込み処理で更新を行う場合には、[キーの値と一致する行は更新]にチェックを入れ、キーとなる[列名]を選択します。 キーとして選択した列が一致した行を更新し、一致しない行を挿入します。キーとして選択した列名がUPDATE文のWHERE句に指定されます。

- 複数のキーを更新条件として指定できます。キーとして選択したすべて列が一致する行を更新します。

## 書き込み対象カラムについて

### 挿入時の動作

挿入時、[スキーマ定義/書き込み対象]にチェックを入れたカラムがINSERT文の挿入対象のカラムとして使用されます。
書き込み対象に含めないカラムに挿入される値は、データベースの仕様やカラムの制約や設定に依存します。
NOT NULL制約のあるカラムを書き込み対象に含めない場合、実行時にエラーとなります。
例:

- スキーマ定義

  [書き込み対象]のチェック | 列名
  --- | ---
  あり | COLUMN1
  なし | COLUMN2
  なし | COLUMN3

- カラムの制約・設定

  COLUMN1 | COLUMN2 | COLUMN3
  --- | --- | ---
  なし | 初期値設定あり(初期値:defaultValue) | NULL許可制約

- 入力データ

  COLUMN1
  data

- 実行されるINSERT文

  INSERT INTO <テーブル名> (COLUMN1) VALUES ('data')

- 処理後のデータ

  COLUMN1 | COLUMN2 | COLUMN3
  --- | --- | ---
  data | defaultValue | null

### 更新時の動作

更新時、[スキーマ定義/書き込み対象]にチェックを入れたカラムがUPDATE文の更新対象のカラムとして使用されます。
書き込み対象に含めないカラムの値は、更新は行われずにそのまま維持されます。
例:

- スキーマ定義

  [書き込み対象]のチェック | [キー]のチェック | 列名
  --- | --- | ---
  あり | なし | COLUMN1
  なし | あり | COLUMN2
  なし | なし | COLUMN3

- 処理前のデータ

  COLUMN1 | COLUMN2 | COLUMN3
  --- | --- | ---
  data1 | data2 | data3

- 入力データ

  COLUMN1 | COLUMN2
  --- | ---
  updateValue | data2

- 実行されるUPDATE文

  UPDATE <テーブル名> SET COLUMN1 = 'updateValue' WHERE COLUMN2 = 'data2'

- 処理後のデータ:

  COLUMN1 | COLUMN2 | COLUMN3
  --- | --- | ---
  updateValue | data2 | data3

## 「アップデート・インサート」と「インサート・アップデート」の違いについて

- [アップデートモード]で[アップデート・インサート]を指定して実行した場合、1行ごとにUPDATE文を実行し、更新がなかった場合にはINSERT文を実行します。
  したがって、入力データにアップデート対象のレコードが多い場合、[アップデート・インサート]を指定して実行する方が、[インサート・アップデート]を指定して実行するよりも効率がよくなります。
- [アップデートモード]で[インサート・アップデート]を指定して実行した場合、1行ごとにINSERT文を実行し、挿入が失敗した場合にはUPDATE文を実行します。
  したがって、入力データにインサート対象のレコードが多い場合、[インサート・アップデート]を指定して実行する方が、[アップデート・インサート]を指定して実行するよりも効率がよくなります。
  - UPDATE文で更新がなかった場合、処理は成功します。たとえば、INSERT文がキーの重複以外の理由で失敗した場合などが当てはまります。

## エラーログについて

バッチ更新時にエラーが発生した場合、エラーに関連する情報がダンプファイル内にエラーログとして出力されます。

### 出力先

$DATAANYWARE_HOME/server/logs/<日付ディレクトリ>/execution/<実行IDディレクトリ>/dump.xml

### 出力内容

以下の情報をfailureResults要素に出力します。

result要素のkey属性値 | 説明
--- | ---
dump_error_message | エラー発生時のダンプ情報を出力します。 [SQL]: エラー発生時に実行したSQL文です。 [Error Records Range]: 入力データでエラーになった箇所の開始行番号と終了行番号です。 [Batch Insert Count]: バッチ更新に成功したデータ数です。 [Batch Size]: バッチサイズです。 [Error Records]: エラー発生時にバッチ更新で用いられたデータを出力します。入力データのError Records Range分が出力されます。
error_code | SQL例外(SQLException)が発生した場合のエラーコードです。

- 書き込み先のデータベースやデータ型によっては、バッチ更新が行われません。
  詳細については、「データベースアダプタの制限事項」の「テーブル書き込み処理」を参照してください。
- クエリー実行中にエラーが発生した場合にエラーログが出力されます。
- 例外監視処理の監視処理内のテーブル書き込み処理でエラーが発生した場合、その処理のダンプファイルは出力されません。

## 仕様制限

- グローバルリソースの一覧設定で、テーブル一覧の表示数を制限していない場合や大きな数を指定している場合、データベースのテーブル数によってはプロパティ設定ダイアログを開くのに時間がかかることがあります。

各データベースアダプタ固有の仕様制限については、「データベースアダプタの制限事項」を参照してください。

## 主な例外

例外名 | 原因 | 対策
--- | --- | ---
InputDataNotFoundException | [入力データ]が指定されていません。 | [入力データ]を指定する、またはデータフローを引いてください。
ResourceNotFoundException リソース定義が見つかりませんでした。名前:[] | [接続先]が指定されていません。 | [接続先]を指定してください。
ResourceNotFoundException リソース定義が見つかりませんでした。名前:[<グローバルリソース名>] | [接続先]で選択されたリソース定義が見つかりません。 | [接続先]で指定したグローバルリソースを確認してください。
InvalidPropertyConfigurationException | [テーブル名]が未設定です。 | [テーブル名]を指定してください。
InvalidPropertyConfigurationException 書き込み対象カラムが選択されていません。 | [スキーマ定義]の[書き込み対象]が選択されていません。 | [スキーマ定義]の[書き込み対象]を1つ以上選択してください。
java.sql.SQLException | データベースアクセスエラーまたはそのほかのエラーが発生しています。 | SQLExceptionのメッセージを確認してください。SQLExceptionのメッセージは各ドライバの仕様に基づいています。SQLExceptionのメッセージにはエラーの原因が出力されている場合があります。 メッセージの詳細については、各データベースベンダーに問い合わせてください。

## 注意事項

- byte[]型として扱うスキーマは、Base64形式またはバイナリ形式のデータが入力できます。

各データベースアダプタ固有の注意事項については、「データベースアダプタの制限事項」を参照してください。