DB2 UDB for iSeries SQLプログラミングコンセプトV5R2の「 SQLプロシージャの定義 」セクションおよびi5/OSインフォメーションセンター、バージョンの「 ストアドプロシージャから結果セットを返す 」セクションを読んだ後5リリース4、次のストアドプロシージャを作成しました。
CREATE PROCEDURE TESTDAT.REPORT (IN DATESTART DATE, IN DATEEND DATE)
LANGUAGE SQL READS SQL DATA
BEGIN
DECLARE CSR1 CURSOR WITH RETURN FOR
SELECT *
FROM SYSIBM.SYSDUMMY1;
OPEN CSR1;
RETURN;
END
次に、同じi5/OSインフォメーションセンター、バージョン5リリース4の「例1:単一の結果セットを返すストアドプロシージャの呼び出し」セクションを読み、SqlDbxクライアント(ODBC経由)またはSSRSレポート(経由)からこのプロシージャを呼び出そうとしましたIBMDASQLプロバイダー)以下のステートメントを使用:
CALL TESTDAT.REPORT (DATE('11/01/2013'), DATE('11/03/2013'));
正常に実行されましたが、結果セットは返されませんでした。これをiSeriesナビゲーターを介して実行すると、2つのステートメント(選択および宣言カーソル)が正常に返されます。呼び出す
SELECT * FROM SYSIBM.SYSDUMMY1;
「Y」が1行のIBMREQD列を返します。上記のドキュメントには何が欠けていますか?
更新:
この手順で生成されるSQLには、すでに説明した以外のオプションが含まれています。
SPECIFIC TESTDAT.REPORT
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *NONE ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
SRTSEQ = *HEX
それらのいずれかがSSRSへの結果セットの返却に影響を与える可能性がありますか?
SSRSのiSeries SQLストアドプロシージャに関するレポートのソリューションは、2つのXMLタグをRSReportDesigner.configに追加することにより、IBMクライアントアクセスに付属するDB2UDB .NetプロバイダーをBIDSにインストールすることです。
以下を.configの<Data>
タグに追加します。
<Extension Name="DB2UDB" Type="IBM.Data.DB2.iSeries.iDB2Connection,IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9CDB2EBFB1F93A26"/>
以下を<Designer>
タグに追加します。
<Extension Name="DB2UDB" Type="Microsoft.ReportingServices.QueryDesigners.GenericQueryDesigner,Microsoft.ReportingServices.QueryDesigners"/>
これにより、データソースプロパティのプロバイダーのリストにDB2UDBが追加されます。次に、データソースで次の形式の接続文字列を使用できます。
Data Source=<IP of FQDN>;Initial Catalog=<DB name>;UserID=<user ID>;Password=<pass>;
ユーザーIDとパスワードは、プロバイダーが[認証情報]タブに入力すると使用できないため、接続文字列に入力する必要があります。
SSRSレポートウィザードは、SPに基づいてレポートを作成できません。代わりに、一時選択ステートメントに基づくレポートを使用する必要があります(select * from sysibm.sysdummy1
または他のクイックセレクトが使用します)。
レポートが作成されると、そのデータセットタイプをクエリからストアドプロシージャに変更できます。 SP名前は手動で入力する必要があります(ドロップダウンは空です)。パラメータは手動で入力する必要があります(パラメータを入力するまでフィールドは更新されません)パラメータ名は一致する必要がありますSPおよび[@<param name>]
として入力されたパラメーター値。日付パラメーターは、次のような値式を使用して、テキストタイプまたは日付/時刻として指定する必要があります。
=FormatDateTime(Parameters!DATESTART.Value, DateFormat.ShortDate)
テキストタイプを使用する場合は、引用符なしで日付を入力します(例:2013年10月31日)
ストアドプロシージャ宣言で欠けているのは、DYNAMIC RESULT SETS
オプション。そのオプションのデフォルト値は0ですが、クライアントソフトウェアを混乱させる可能性があります。それ(クライアントソフトウェア)がストアドプロシージャから返されたカーソルを処理できるかどうかは別の話です。
iSeriesナビゲーターは2つのステートメントを「戻しません」。データの結果タブではなく、メッセージタブにそれらをエコーしました。
SYSIBM.SYSDUMMY1は、1つの列と1つの行を持つIBM提供のテーブルです。あなたが書いた手順に対する正しい答えを得ました。
SYSDUMMY1は通常、サンプルコードでは、テーブルを必要としない式を評価するためのプロキシとして使用されます。例えば:
SELECT monthname(CURRENT DATE)
FROM SYSIBM.SYSDUMMY1;
ただし、VALUESステートメントはこれらの状況でも同様に機能し、データソースとしてテーブルやビューを必要としないため、これは不要な構成です。
VALUES monthname(CURRENT DATE);
SELECT INTOが使用される場合、VALUES INTOは同等です。
SYSDUMMY1を使用する必要がなくなったので、何を達成しようとしているのかという疑問が残ります。