[OutSystems]SQL Widgetの使い方

# 初めに
OutSystemsでは通常、AggregateやEntity Actionを使ってデータベースからデータを読み込んだり書き出したりします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/16db69d7-8811-7c72-9e3f-d1dfe4ea0d34.png "Aggregate")
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/b64387ec-12e5-c8b1-ccfe-1823bc79c497.png "Entity Action")
しかし、AggregateやEntity Actionでは実現できないこともあります。例えば以下のようなことです。

* 副問合せ
* 一括Insert, Update, Delete（Entity Actionでは1件ずつInsert, Update, Deleteすることになり大量データ処理には向かない）

やっぱLow-Code Platformじゃできないこともあるよね・・・と諦めてなくても大丈夫です！こういった場合のためにOutSystemsにはSQLというWidgetが用意されています。ただ、使う機会が限られているが故にあまり情報もありませんので、ここで整理したいと思います。

# 想定読者
* OutSystemsを使う開発者

# 対象とすること
* OutSystemsのSQL Widgetの使い方

# 対象としないこと
* 通常のSQLの書き方

# 前提
以下のようなEntityを作成し適当にデータ登録しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/ebe1d4e6-9ba9-e790-fc43-7cf405e2ec20.png)

# SELECTの書き方
では、早速Actionの中にSQL Widgetを配置しStatementを編集していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/36858827-5130-3382-33e5-eed7e4b11cc3.png)

## ポイント
* Entityは{}で、Attributeは[]で囲みます。また、{Data}.[Id]などと書くことにより、Attribute IdのFind Usagesでヒットするようになります。[Id]とだけ書いても動くのですが、{Data}.[Id]と書くようにしましょう
* バインド変数を利用する場合はParametersにQuery Parameterを追加します
* Output Entities / Structuresに取得結果を格納する変数の型を設定しましょう
* 通常のSQL同様セミコロンも書きましょう（書かなくても動くのですが、書く理由は後述）
* Test Inputsを入力しTestボタンを押すとSQLのテストができますので、ここでエラーが発生しないことを確認しておきましょう。また実際に発行したSQLをExecuted SQLで確認できます

# UPDATE, DELETEの書き方
次はUPDATE, DELETEです。基本的にはSELECTの場合と同じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/337041/525f5e71-2222-6290-1641-f41db4d696a8.png)

## ポイント
* UPDATE, DELETEの場合であってもOutput Entities / Structuresに取得結果を格納する変数の型を設定が必要です（この変数には何も格納されないためダミーの型でOKです）
* ここでTESTをしても実際のデータは更新されないため、心配せずにテストしましょう
* そして実は1つのSQL Widgetには複数のSQLを記述できます。そのためにも普段からセミコロンを付けておきましょう。例えば1つのSQL Widgetで関連するデータをまとめて削除するといった使い方はありえます **-> バージョンによってはエラーになるようです。OutSystems11では動きましたが、OutSystems10ではエラーになってしまいました**

# 参考
<TABLE ALIGN=CENTER><TR><TD WIDTH=400px>
 <A HREF="https://success.outsystems.com/Documentation/11/Developing_an_Application/Use_Data/Query_Data/Write_Your_Own_SQL_Queries" TARGET="_blank"><STRONG>独自のSQLクエリを書く - OutSystems</STRONG></A>
 <A HREF="http://b.hatena.ne.jp/entry/https://success.outsystems.com/Documentation/11/Developing_an_Application/Use_Data/Query_Data/Write_Your_Own_SQL_Queries" TARGET="_blank">
 <IMG BORDER="0" SRC="http://b.hatena.ne.jp/entry/image/https://success.outsystems.com/Documentation/11/Developing_an_Application/Use_Data/Query_Data/Write_Your_Own_SQL_Queries" BORDER="0" ALT="" /></a>
 <BR>
 独自のSQLクエリを書く - OutSystems... 
 </TD>
 <TD WIDTH=150px>
 <IMG STYLE="float:left;margin-right:.5em;" SRC="http://capture.heartrails.com/120x120/cool?https://success.outsystems.com/Documentation/11/Developing_an_Application/Use_Data/Query_Data/Write_Your_Own_SQL_Queries" ALT="" WIDTH="120" HEIGHT="120" />
 </TD></TR>
</TABLE>
<TABLE ALIGN=CENTER><TR><TD WIDTH=400px>
 <A HREF="https://success.outsystems.com/Documentation/Development_FAQs/How_to_delete_data_from_Entities" TARGET="_blank"><STRONG>Development FAQs - OutSystems</STRONG></A>
 <A HREF="http://b.hatena.ne.jp/entry/https://success.outsystems.com/Documentation/Development_FAQs/How_to_delete_data_from_Entities" TARGET="_blank">
 <IMG BORDER="0" SRC="http://b.hatena.ne.jp/entry/image/https://success.outsystems.com/Documentation/Development_FAQs/How_to_delete_data_from_Entities" BORDER="0" ALT="" /></a>
 <BR>
 Development FAQs - OutSystems... 
 </TD>
 <TD WIDTH=150px>
 <IMG STYLE="float:left;margin-right:.5em;" SRC="http://capture.heartrails.com/120x120/cool?https://success.outsystems.com/Documentation/Development_FAQs/How_to_delete_data_from_Entities" ALT="" WIDTH="120" HEIGHT="120" />
 </TD></TR>
</TABLE>