ストアド・プロシージャを実行します。
Synopsis
CALL procname(:arg1,:arg2,...)
引数
procname ストアド・プロシージャの名前
arg1 オプション — コンマ区切りリストで指定した、ストアド・プロシージャの 1 つまたは複数の引数。普通は、コロン (:) を接頭語として持つホスト変数として指定します。
概要
CALL 文は、ストアド・プロシージャを実行します。
Caché ObjectScript の埋め込み SQL では、CALL 文の発行、または DO コマンドによる基本ルーチンや基本メソッドの呼び出しが可能です。
Caché は、ODBC 2.x 標準および JDBC 1.0 標準で定義されている CALL 構文を全面的にサポートしています。JDBC では、CallableStatement クラス・メソッドから CALL を実行できます。ODBC では、API を利用します。CALL の構文と意味は、JDBC と ODBC でまったく同じです。さらに、処理方法も同様です。どちらのドライバも文のテキストを解析し、文が CALL の場合は、SQL エンジンを経由せずに、サーバ側の専用メソッドを直接呼び出します。
ODBC、JDBC クライアント
PERSON クラスに SP1 と呼ばれるストアド・プロシージャが存在する場合、ODBC や JDBC クライアント (Microsoft Query など) からこのプロシージャを以下のように呼び出すことができます。
retcode = SQLExecDirect(hstmt, "{?=call PERSON_SP1(?,?)}", SQL_NTS);
Caché では、ストアド・プロシージャを呼び出す文の構造は、ODBC 標準に準拠しています。この標準の情報に関しては、関連する文書を参照してください。
ODBC で使用する場合にのみ、Caché では呼び出しに柔軟な構文を適用できるので、CALL の前後の{ }括弧やパラメータの前後の括弧は必要ありません。(これは、適切なプログラミング形式です。 上記の例はこれらを使用しています)。
同様に、ODBC で使用する場合にのみ、Caché では、既定のパラメータを使用するために変更された構文を適用できます。したがって、CALL SPCALL SP() とは異なる機能を持ちます。2 番目のフォームは、既定のパラメータを使用しないことを意味します — これは CALL SP (,,)SP(,?,)、または他の構文などと同様です。つまり、CALL では、括弧を使用したフォームと括弧を使用しないフォームは異なります。
埋め込み SQL からの呼び出し
以下のように、埋め込み SQL 文を作成することで、ストアド・プロシージャを呼び出すことができます。
   &sql(CALL MyProc(:a,:b,:c))
Caché ObjectScript
埋め込み 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)
クエリ・ベースのストアド・プロシージャを多くのストアド・プロシージャ内に入れ子にする場合、ラッパ・メソッドを記述してすべて非表示にすると便利です。
関連項目