AS400从另一个存储过程调用存储过程

时间:2016-01-18 13:56:49

标签: c# database stored-procedures db2 ibm-midrange

我正在尝试从另一个存储过程调用存储过程。 我尝试了不同的语法但没有成功。

第一个存储过程返回一个表。对于测试,我只想从第二个存储过程返回第一个存储过程。

第一个存储过程(SP01):

BEGIN
DECLARE C2 CURSOR WITH RETURN FOR

SELECT DISTINCT TBL.*
FROM LIB.TABLE1 TBL;

OPEN C2 ;
END 

从c#调用它时工作正常。

第二个存储过程(SP02):

BEGIN
DECLARE C2 CURSOR WITH RETURN FOR

CALL SP01();

OPEN C2 ;
END 

我收到错误:

  

供应商代码:-104
  消息:[SQL0104]令牌SP01无效。有效代币:;。原因....
  在令牌SP01处检测到语法错误。

SP02的正确语法/方法是什么?

编辑:

在ms访问中,我能够根据另一个查询QUERY1:

创建查询QUERY2
SELECT * FROM QUERY1;

甚至像桌子一样加入

SELECT * FROM TABLE1 INNER JOIN QUERY1 ON (TABLE1.FIELD1 = QUERY1.FIELD1);

我需要将所有表和查询从mdb移动到AS400并编写一个使用这些查询的C#应用​​程序。

我在网上看不到这么多例子,也许我的方法是错的。 我有多个查询要运行,每个查询都依赖于另一个查询。我想从我的C#应用​​程序调用一个存储过程,这个将调用另一个存储过程,依此类推。 这是一种运行一系列相互依赖的查询的正确方法吗?

或者有没有办法从我的c#应用程序中独立调用所有查询,并从代码中构建它们之间的依赖关系,看起来这种方法是错误的?

1 个答案:

答案 0 :(得分:1)

如果您使用的是IBM i 6.1或更早版本,则无法使用语言SQL存储过程访问存储过程返回的结果集。对于7.1或更高版本,可以使用ASSOCIATE RESULT SET LOCATORS语句来检索结果集。有关详细信息,请参阅SQL Reference手册(http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzassocloc.htm?lang=en)中的ASSOCIATE LOCATORS语句。

一旦有了定位器,就可以使用ALLOCATE CURSOR语句(http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_72/db2/rbafzalloccsr.htm?lang=en)从RESULT SET LOCATOR获取一个游标。

可在此处找到更多示例:http://www.itjungle.com/fhg/fhg082510-printer02.html