# ルールを記述するSQLテンプレート

## SQLステートメント

SQLステートメントは、関連するJDBCが実行できる有効なSQLステートメントを指しています。SQLテンプレートコードは、SQLステートメントのグループです。SQLテンプレートエディターでSQLステートメントを記述するための基本ルールは次のとおりです。

* SQLステートメントは;で終わる必要があります。

* SQLステートメントは複数行にわたってもかまいません。この場合、最後の行を除いて、どの行も;で終了しないようにしてください。

## コメント行

コメント行は、#または--。#または--で始まる行は、コードの生成時に無視されます。

情報メモ注:

SQLステートメントの中間部分または&lt;%... %&gt;構文内には例外はありません。

## &lt;%...%&gt;構文

この構文は複数行に渡ってもかまいません。次のリストに、この構文で実行できる操作と注意すべき点を示します。

* 新しい変数を定義し、if、for、while、などのJava論理コードを使用し、パラメーター値を取得することもできます。

  たとえば、FILE\_Nameパラメーターを取得するには、次のようにコードを使用します。

```
<%
         String filename = __FILE_NAME__;
         %>
```

* この構文は、SQLステートメント内では使用できません。つまり、2つの個別のSQLステートメントの間で使用する必要があります。

  たとえば、次のコードでの構文は有効です。

```
#sql sentence
         DROP TABLE temp_0;
         <%
         #loop
         for(int i=1; i<10; i++){
         %>
         #sql sentence
         DROP TABLE temp_<%=i %>;
         <%
         }
         %>
         #sql sentence
         DROP TABLE temp_10;
```

この例では、構文は2つの個別のSQLテンプレート: DROP TABLE temp\_0;およびDROP TABLE temp\_&lt;%=i%&gt;;の間で使用します。

SQLステートメントは、temp\_0で始まるいくつかのテーブルを削除することを目的としています。&lt;%と%&gt;の間のコードは、ループ内に数カラムを生成して削除するテーブルを特定し、数値の生成後にループを閉じます。

* この構文内では、&lt;%=...%&gt;または&lt;/.../&gt;構文は使用しないでください。

&lt;%=...%&gt;および&lt;/.../&gt;は、SQLテンプレートでの使用も目的としています。以降のセクションでは、関連情報について説明しています。

情報メモ注:

SQLテンプレートではこの構文で、単純なパラメーターにアクセスできます。パラメーターは多くの場合接続目的で使用し、TABLE\_NAME、DB\_VERSION、SCHEMA\_TYPEなどのコンポーネント内で簡単に定義できます。

## &lt;%=...%&gt;構文

この構文は複数行にまたがることはできず、SQLステートメントで使用されます。次のリストに、この構文で実行できる操作と注意すべき点を示します。

* この構文は変数値を生成するために使用でき、さらに、既存のパラメーターの値を生成するためにも使用できます。

* &lt;%=の後ろにスペース文字は使用できません。

* この構文内では、&lt;%...%&gt;または&lt;/.../&gt;構文は使用しないでください。

次の例に記述されたステートメントは有効です。

```
#sql sentence
         DROP TABLE temp_<%=__TABLE_NAME__ %>;
```

コードは、関連付けられたコンポーネントを通じて定義されたテーブルを削除するために使用されます。

SQLテンプレートに関連付けられているコンポーネントの詳細は、[ジョブデザインとは](https://help.qlik.com/talend/ja-JP/studio-user-guide/8.0/what-is-job-design)をご覧ください。

&lt;%=...%&gt;構文の詳細は、[<%...%>構文](https://help.qlik.com/talend/ja-JP/studio-user-guide/8.0/sql-template-writing-rules#the---...---syntax_r)をご覧ください。

&lt;/.../&gt;構文の詳細は、次のセクションをご覧ください。

情報メモ注:

SQLテンプレートではこの構文で、単純なパラメーターにアクセスできます。パラメーターは多くの場合接続目的で使用し、TABLE\_NAME、DB\_VERSION、SCHEMA\_TYPEなどのコンポーネント内で簡単に定義できます。

## "&lt;/.../&gt;"構文

この構文は複数行にまたがることはできません。次のリストに、この構文で実行できる操作と注意すべき点を示します。

* この構文は、既存のパラメーターの値を生成するために使用できます。生成された値は、引用符で囲まないでください。

* スペース文字は&lt;/の後ろと/&gt;の前には使用できません。

* この構文内では、&lt;%...%&gt;または&lt;%=...%&gt;構文は使用しないでください。

次の例に記述されたステートメントは有効です。

```
#sql sentence
         DROP TABLE temp_</TABLE_NAME/>;
```

ステートメントは、TABLE\_NAMEパラメーターを特定し、その後対応するテーブルを削除します。

&lt;%=...%&gt;構文の詳細は、[<%...%>構文](https://help.qlik.com/talend/ja-JP/studio-user-guide/8.0/sql-template-writing-rules#the---...---syntax_r)をご覧ください。

&lt;%=...%&gt;構文の詳細は、[<%=...%>構文](https://help.qlik.com/talend/ja-JP/studio-user-guide/8.0/sql-template-writing-rules#the----...---syntax_r)をご覧ください。

以降のセクションでは、より複雑なパラメーターにアクセスするために使用されるより具体的なコードを示します。

情報メモ注:

SQLテンプレートではこの構文で、単純なパラメーターにアクセスできます。パラメーターは多くの場合接続目的で使用し、TABLE\_NAME、DB\_VERSION、SCHEMA\_TYPEなどのコンポーネント内で簡単に定義できます。

## コンポーネントスキーマエレメントにアクセスするためのコード

コンポーネントスキーマエレメントは、スキーマカラム名リスト(ドット.区切り)で表されます。これらのエレメントは、ユーザーによってコンポーネント内で作成され定義されます。

次のコードは、コンポーネントスキーマに含まれるいくつかのエレメントにアクセスするための例を構成しています。次の例では、コンポーネントスキーマを取得するために、ELT\_METADATA\_SHEMA変数名が使用されています。

```
<%
         String query = "select ";
         SCHEMA(__ELT_METADATA_SHEMA__);
         for (int i=0; i < __ELT_METADATA_SHEMA__.length ; i++) {
         query += (__ELT_METADATA_SHEMA__[i].name + ",");
         }
         query += " from " + __TABLE_NAME__;
         %>
         <%=query %>;
```

この例では、実行する内容に基づいて\_\_ELT\_METADATA\_SHEMA\_\_[i].nameコードは\_\_ELT\_METADATA\_SHEMA\_\_[i].dbType、\_\_ELT\_METADATA\_SHEMA\_\_ [i].isKey, \_\_ELT\_METADATA\_SHEMA\_\_[i].lengthまたは\_\_ELT\_METADATA\_SHEMA\_\_[i].nullableに置き換え、スキーマカラムのもう一方のフィールドにアクセスできます。

抽出ステートメントはSCHEMA(\_\_ELT\_METADATA\_SHEMA\_\_);です。このステートメントで、ELT\_METADATA\_SHEMAは抽出するスキーマパラメーターを表す変数名です。コードで使用されている変数名は単なる例です。変数名を別の変数名に変更して、定義済みのスキーマパラメーターを表すことができます。

情報メモ警告:

スキーマパラメーターにつける名前が他のパラメーターの名前と競合していないことをご確認ください。

コンポーネントスキーマの詳細は、[\[Basic settings\] (基本設定)タブ](https://help.qlik.com/talend/ja-JP/studio-user-guide/8.0/basic-settings-tab)をご覧ください。

## コンポーネントマトリクスプロパティにアクセスするためのコード

コンポーネントマトリクスプロパティは、さまざまなデータ変換目的に応じて、ユーザーによって作成および変更されます。これらのプロパティは、たとえば、ユーザーがtSQLTemplateAggregateコンポーネントを介して定義できるoperationパラメーターやgroupbyパラメーターなどのテーブルパラメーターによって定義されます。

本来柔軟性が高く複雑なこれらのテーブルパラメーターにアクセスするために、2通りのアプローチを使用できます。

* &lt;/.../&gt;アプローチ:

&lt;/.../&gt;は、SQLテンプレートによって使用される構文の1つです。このアプローチでは、通常、抽出するパラメーターごとにハードコーディングする必要があります。

たとえば、ユーザーによって新しいパラメーターが作成され、NEW\_PROPERTYという名前が付けられます。&lt;/NEW\_PROPERTY/&gt;を使用してアクセスするには、以下のコードが必要です。

```
else if (paramName.equals("NEW_PROPERTY")) {
         List<Map<String, String>> newPropertyTableValue = (List<Map<String, String>>)
         ElementParameterParser.getObjectValue(node, "__NEW_PROPERTY__");
         for (int ii = 0; ii <newPropertyTableValue.size(); ii++) {  
         Map<String, String> newPropertyMap =newPropertyTableValue.get(ii);
         realValue += ...;//append generated codes
         ......
         }
         }
```

* EXTRACT(\_\_GROUPBY\_\_);アプローチ:

次のコードは、テーブルパラメーター(GROUPBY)にアクセスするための2番目の方法を示しています。

```
<%
         String query = "insert into " + __TABLE_NAME__ + "(id, name, date_birth) select sum(id), name, date_birth from cust_teradata group by";
         EXTRACT(__GROUPBY__);
         for (int i=0; i < __GROUPBY_LENGTH__ ; i++) {
         query += (__GROUPBY_INPUT_COLUMN__[i] + " ");
         }
         %>
         <%=query %>;
```

ステートメントをコーディングする際には、次のルールに準拠します。

* 抽出ステートメントはEXTRACT(\_\_GROUPBY\_\_);を使用する必要があります。大文字を使用する必要があり、スペース文字は使用できません。このステートメントは、&lt;% and %&gt;。

* \_\_GROUPBY\_LENGTH\_\_を使用して、パラメータ名の後に\_LENGTHが続き、[Component] (コンポーネント)ビューの[Groupby]エリアで定義するGROUPBYテーブルパラメーターの行番号を取得します。&lt;%と%&gt;または&lt;%=と%&gt;の間で使用できます。

* \_\_GROUPBY\_INPUT\_COLUMN\_\_[i] tのようなコードを使用して、パラメーター値を抽出します。これは&lt;%と%&gt;の間、または&lt;%=と%&gt;の間で使用できます。

* パラメーターに正しくアクセスするために、複数のパラメーターで同じ名前のプレフィックスを使用しないでください。たとえばコンポーネントでは、名前の同じプレフィックスが誤ったコード生成を引き起こすため、PARAMETER\_NAMEとPARAMETER\_NAME\_2の名前を持つ 2 つのパラメーターを定義することは避けてください。