ストアド・プロシージャを実行します。
Synopsis
CALL procname(:arg1,:arg2,...)
CALL 文は、ストアド・プロシージャを実行します。
Caché ObjectScript の埋め込み SQL では、
CALL 文の発行、または
DO コマンドによる基本ルーチンや基本メソッドの呼び出しが可能です。
Caché は、ODBC 2.x 標準および JDBC 1.0 標準で定義されている
CALL 構文を全面的にサポートしています。JDBC では、CallableStatement クラス・メソッドから
CALL を実行できます。ODBC では、API を利用します。
CALL の構文と意味は、JDBC と ODBC でまったく同じです。さらに、処理方法も同様です。どちらのドライバも文のテキストを解析し、文が
CALL の場合は、SQL エンジンを経由せずに、サーバ側の専用メソッドを直接呼び出します。
PERSON クラスに SP1 と呼ばれるストアド・プロシージャが存在する場合、ODBC や JDBC クライアント (Microsoft Query など) からこのプロシージャを以下のように呼び出すことができます。
retcode = SQLExecDirect(hstmt, "{?=call PERSON_SP1(?,?)}", SQL_NTS);
Caché では、ストアド・プロシージャを呼び出す文の構造は、ODBC 標準に準拠しています。この標準の情報に関しては、関連する文書を参照してください。
ODBC で使用する場合にのみ、Caché では呼び出しに柔軟な構文を適用できるので、
CALL の前後の{ }括弧やパラメータの前後の括弧は必要ありません。(これは、適切なプログラミング形式です。 上記の例はこれらを使用しています)。
同様に、ODBC で使用する場合にのみ、Caché では、既定のパラメータを使用するために変更された構文を適用できます。したがって、
CALL SP は
CALL SP() とは異なる機能を持ちます。2 番目のフォームは、既定のパラメータを使用しないことを意味します これは
CALL SP (,,) や
SP(,?,)、または他の構文などと同様です。つまり、
CALL では、括弧を使用したフォームと括弧を使用しないフォームは異なります。
以下のように、埋め込み SQL 文を作成することで、ストアド・プロシージャを呼び出すことができます。
&sql(CALL MyProc(:a,:b,:c))
埋め込み SQL から直接ストアド・プロシージャを呼び出すのではなく、ストアド・プロシージャを持つクラス・メソッドを Caché ObjectScript から呼び出すことによって、そのストアド・プロシージャを実行することもできます。この場合、パラメータの管理が必要になります。また、クエリに基づいたストアド・プロシージャでは、個別のメソッドを呼び出し、フェッチ・ループを管理する必要もあります。
例えば以下は、パラメータを持たない UpdateAllAvgScores と呼ばれるストアド・プロシージャを含むメソッドを呼び出すためのコードは、以下のようになります。
NEW phnd
SET phnd=##class(%SQLProcContext).%New()
DO ##class(students).UpdateAllAvgScores(phnd)
IF phnd.SQLCode QUIT phnd.SQLCode
USE 0
WRITE !,phnd.RowCount," Rows Affected"
CALL 文でプロシージャの引数を指定する際、そのプロシージャで %Library.SQLProcContext パラメータが明示的に定義されている場合は、%Library.SQLProcContext パラメータを指定
しないでください。このパラメータは自動的に処理されます。
クエリとして実装されているストアド・プロシージャを呼び出すためには、以下の 3 つのメソッドすべてを呼び出す必要があります。
NEW qhnd
DO ##class(students).GetAvgScoreExecute(.qhnd,x1)
NEW avgrow,AtEnd
SET avgrow=$lb("")
SET AtEnd=0
DO ##class(students).GetAvgScoreFetch(.qhnd,.avgrow,.AtEnd)
SET x5=$lg(avgrow,1)
DO ##class(students).GetAvgScoreClose(qhnd)
クエリ・ベースのストアド・プロシージャを多くのストアド・プロシージャ内に入れ子にする場合、ラッパ・メソッドを記述してすべて非表示にすると便利です。