在阅读了 DB2 UDB for iSeries SQL Programming Concepts 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;
返回具有 1 行“Y”的 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 吗?
您在存储过程声明中缺少的一件事是
DYNAMIC RESULT SETS
选项。该选项的默认值为 0,这可能会使客户端软件感到困惑。它(客户端软件)是否甚至可以处理存储过程返回的游标是另一回事。在 SSRS 中报告 iSeries SQL 存储过程的解决方案是通过将两个 XML 标记添加到 RSReportDesigner.config 来将 IBM Client Access 附带的 DB2UDB .Net 提供程序安装到 BIDS 中。
将以下内容添加到
<Data>
.config 中的标记:将以下内容添加到
<Designer>
标签中:这会将 DB2UDB 添加到数据源属性中的提供者列表中。然后,您可以在数据源中使用具有以下格式的连接字符串:
用户 ID 和密码需要输入连接字符串,因为如果输入凭据选项卡,提供商将无法使用它们。
SSRS 报告向导无法基于 SP 创建报告。应改为使用基于临时选择语句的报告(
select * from sysibm.sysdummy1
或任何其他快速选择都可以)。创建报表后,可以将其数据集类型从查询更改为存储过程。SP 名称必须手动输入(下拉列表为空)。必须手动输入参数(在输入参数之前不会刷新字段)。参数名称需要匹配 SP 和输入为 的参数值
[@<param name>]
。日期参数必须指定为文本类型或日期/时间,其值表达式类似于:如果使用文本类型,请输入不带引号的日期,例如:2013 年 10 月 31 日
iSeries Navigator 没有“返回”两个语句。它在消息选项卡中呼应它们,而不是在数据结果选项卡中。
SYSIBM.SYSDUMMY1 是 IBM 提供的具有 1 列和 1 行的表。你得到了你写的程序的正确答案。
SYSDUMMY1 通常在示例代码中用作评估不需要任何表的表达式的代理。例如:
然而,这是一个不必要的结构,因为 VALUES 语句在这些情况下同样有效,并且不需要表或视图作为数据源
在将使用 SELECT INTO 的情况下,VALUES INTO 是等效的。
因此,既然我们已经消除了您使用 SYSDUMMY1 的需要,那么问题仍然是您想要完成什么?