[an error occurred while processing this directive] [an error occurred while processing this directive]


プログラミング
逆引き
クライアントとの通信
VisMでの通信
Factoryでの通信
WebServiceでの通信
CSP (Cache' Server Pages)
Cache'SQL
設定・性能


【広告】









SQL文を実行する

Execute SQL command.

Cache'でSQL文を実行するには以下のような方法があります。


システム管理ポータルからの実行

システム管理ポータルに接続し、 画面中央のデータ管理から、「SQL」を選択してください。

次に「SQL文の実行」を選択してください。

画面のテキストエリアにSQL文を入力してください。

select *
from 顧客
where 住所 like '東京都%'

「クエリ実行」ボタンを押すと、テキストエリアの下側に結果が表示されます。




ターミナルからの実行

 ターミナルからSQLを実行するには、SQL Shellを使用する方法と、ResulSetを使用する方法があります。

SQL Shellを使用してSQLを実行する

USER>Do $System.SQL.Shell()

>>SELECT * FROM 顧客 WHERE 住所 like '東京%'
(1)>>go
3       0334821986      おおしま じろう 有限会社 大島   東京都世田谷区世谷1-2-3
特にクレームしないお客様です    大島 次郎       社長    1100011 03348219853
4       0333456789      いしだ なおき   石田 商事       東京都江東区港東333-333
新しい製品をお勧めください      石田 直樹       販売    1200034 03334567894
>>EXIT
Do $System.SQL.Shell()
SQLシェルを起動します。
>>SELECT * FROM 顧客 WHERE 住所 like '東京%'
SQL文を設定しています。ここではSQL文の解釈が行われますが、実行は行われません。
(1)>>go
SQL文を実行しています。
>>EXIT
SQLシェルのセッションを終了し、ターミナルに戻ります。

%ResultSetを使用してSQLを実行する

USER>Set rset=##class(%ResultSet).%New("%DynamicQuery:SQL")

USER>Do rset.Prepare("SELECT * FROM 顧客 WHERE 住所 like '東京%'")

USER>Do rset.Execute()

USER>For  Quit:'rset.Next()  Write rset.Get("姓名"),!
大島 次郎
石田 直樹

USER>Do rset.%Close()

こちらはSQL Shellを実行する方法と比べると手間がかかりますが、SQL Shellはルーチン内で使えないためこの手順は覚えておく必要があります。

Set rset=##class(%ResultSet).%New("%DynamicQuery:SQL")
変数rsetに%RseultSetクラスのインスタンスを設定しています。%ResultSetの種類として、%DynamicQuery:SQLを設定しています。
Do rset.Prepare("SELECT * FROM 顧客 WHERE 住所 like '東京%'")
SQL文を設定しています。ここではSQL文の解釈が行われますが、実行は行われません。
Do rset.Execute()
SQL文を実行しています。SQL文に引数を渡す場合はここで渡します。
For  Quit:'rset.Next()  Write rset.Get("姓名"),!
次の検索結果をNext()で取得して、次がなくなるまでまわしています。存在する場合は姓名を表示します。
Do rset.%Close()
インスタンスを閉じています。閉じても変数は残るので、必要であればKillして下さい。

※最近のバージョンでは%SQL.Statementの使用が推奨されているようです。http://docs.intersystems.com/cache20101j/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_dynsql それぞれの違いについても、このページに以下のように記述されています。
  • %ResultSet.SQL は、%Prepare メソッドの 4 番目以降の引数として入力パラメータの値を指定します。入力パラメータの個数に制限はありません。入力パラメータを使用して、TOP 節と WHERE 節に値を渡すことができますが、SELECT リストに値を渡すことはできません。
  • %Library.ResultSet は、Execute メソッドの引数として入力パラメータの値を指定します。指定できる入力パラメータの数は 16 個までです。入力パラメータを使用して、TOP 節と WHERE 節に値を渡すことができますが、SELECT リストに値を渡すことはできません。
  • %SQL.Statement は、%Execute メソッドの引数として入力パラメータの値を指定します。入力パラメータの個数に制限はありません。入力パラメータを使用して、TOP 節および WHERE 節に値を渡したり、SELECT リストに式を渡したりできますが、SELECT リストに列名を渡すことはできません。


  • ルーチン中からの実行

    %ResultSetを使用してSQLを実行する

    ターミナルからの実行の%ResultSetを使用してSQLを使用するを参照してください。

    &sql( ) タグを使用してSQLを実行する

    &sql(declare Cur cursor for select 姓名, 住所 into :name,:addr from 顧客 where 住所 like '東京都%')
    &sql(open Cur)
    &sql(fetch Cur)
    While(SQLCODE = 0) {
      Write $Get(name),$Get(addr),!
      &sql(fetch Cur)
    }
    &sql(close Cur)
    &sql( )は1つの値しか返すことができないため、複数の結果を取得する必要がある場合は上記のようにカーソルを使用する必要があります。
    詳細はhttp://docs.intersystems.com/cache20101j/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL_esqlを参照してください。



    CSPからの実行

    ルーチン中からの実行の各方法が使えます。

    <script language=SQL> タグを使用してSQLを実行する

    CSP中でのみ使える<script language=SQL>というタグがあります。%ResultSetを使用してSQLを使用する方法の%ResultSetを用意するまでの手順が簡素化されたものと考えて良いと思います。
    <script language="SQL" NAME="tags">
     SELECT empNo, Name
     FROM Employee
     WHERE Age < #(age)#
    </script>

    <csp:while condition="tags.Next()" counter="c">
     <tr>
      <td>#(emps.Get("empNo"))#
      <td>#(emps.Get("Name"))#
    </csp:while>
    このように、NAME=で指定した変数名(この例ではtags)に%ResultSetが作成されます。
    <script language=SQL>内での変数の使用時には#( )#で囲む必要がありますが、その場合はSQLインジェクションを発生させないよう注意が必要です。




    SQLマネージャからの実行(Cache'5.0以前)

    Cache' 5.0以前にはSQLマネージャというツールがありました。以下はその使用方法です。

    SQLマネージャを実行してください。
    画面左側のツリーから、テーブルを選択してください。

    次に「クエリの実行」タブをクリックしてください。

    画面右側の白いテキストボックスにSQL文を入力してください。

    select *
    from 顧客
    where 住所 like "東京都%"

    画面右端の、「クエリの実行」アイコンをクリックすると下側に結果が表示されます。






    [an error occurred while processing this directive] [an error occurred while processing this directive]
    2012/11/19Update