Stored procedures 我如何从SQuirreL SQL调用没有参数的DB2存储过程?

Stored procedures 我如何从SQuirreL SQL调用没有参数的DB2存储过程?,stored-procedures,db2,squirrel-sql,Stored Procedures,Db2,Squirrel Sql,我非常喜欢SquirrelSQL作为一种SQL查询工具,但我从未能够让它调用as/400DB2数据库中的存储过程。我总是会遇到错误“设置或注册的参数值的数量与参数的数量不匹配”。我已经仔细检查了参数的数量,但没有运气。这是我尝试过的一个过程的语法,它一进一出: 调用一些存储过程(12345,?) 我认为如果其中有一个,那么电话应该是: CALL SomeSProc(12345) 要获得结果,请尝试以下操作: SELECT * FROM SomeSProc(12345) 在Squirrel中,

我非常喜欢SquirrelSQL作为一种SQL查询工具,但我从未能够让它调用as/400DB2数据库中的存储过程。我总是会遇到错误“设置或注册的参数值的数量与参数的数量不匹配”。我已经仔细检查了参数的数量,但没有运气。这是我尝试过的一个过程的语法,它一进一出:


调用一些存储过程(12345,?)

我认为如果其中有一个,那么电话应该是:

CALL SomeSProc(12345)
要获得结果,请尝试以下操作:

SELECT * FROM SomeSProc(12345)

在Squirrel中,您可以使用类似的内容。您需要确保声明变量的类型与存储过程中out参数的类型匹配

BEGIN
    DECLARE outParam INT;
    STORED_PROC_NAME(outParam);
END
如果您还需要为过程提供输入,您可以这样做

BEGIN
    DECLARE outParam INT;
    STORED_PROC_NAME('input', outParam);
END

您还需要将语句分隔符更改为
以外的内容。否则,它将分解语句并尝试分别发送每个片段。

在squirrel>session>session properties>SQL中更改语句分隔符:'#'


在DbVisualizer的pro版本中,启用SQL Commander菜单选项下的“SQL中的流程参数标记”后,它将允许“?”参数


下面是一个使用db2存储过程在Squirrel3.7上运行的测试示例。诀窍是通过一个过渡存储过程MY_PROC_TEST来调用真正的存储过程PROC_TEST


squirrel>会话>会话属性>SQL中的更改语句分隔符:@

DROP PROCEDURE MY_PROC_TEST()@
CREATE PROCEDURE MY_PROC_TEST()
RESULT SETS 1 -- out resultset (call product)
LANGUAGE SQL
BEGIN
  DECLARE flag SMALLINT; -- out parameter
  CALL MY_PROC('2015', flag);
END @
CALL MY_PROC_TEST()@
END @
然后您可以这样调用sored过程:


调用MY_PROC_TEST()

使用开源“SQL Workbench/J”()我能够调用一个过程:

wbcall SOMESPROC(12345, ?);
它有自己的命令来调用过程“wbcall”。使用?用于输出参数


注意:在安装SQL Workbench/J时,请确保从下载正确的DB2驱动程序,并在SQL Workbench/J中添加驱动程序时添加许可证文件。

如果更改分隔符(如上所述),这将在Squirrel中起作用。但是,要查看变量是什么,您需要执行以下操作

在我的示例中,我将分隔符设置为平铺(~)。包括在最后一个“结束”之后,“选择”之前。代码从这里开始

begin
declare inoutParm numeric(2,0);
call spMyStoredProcedure(
             1234567                                     
           , inoutParm                                           
       );
declare global temporary table session.myTempTbl  
       (MyResult   char(1024) )                                         
with replace ;
insert into session.myTempTbl
  (myResult)
   values(inoutParm) ;  
end
~
select myResult from session.myTempTbl

麦克·基利
as400(db2)SQL开发人员

问题在于没有得到结果。我想上次我尝试一个没有任何OUT参数的存储过程时,结果像直接查询一样返回。问题是处理OUT参数。OUT参数不是SP的结果吗?不,它们不是一回事。存储过程可以通过三种方式生成输出:通过resultset、OUT参数和第三种方式,我将调用返回值(不确定名称是否正确)。所以您可能有这样的内容:?=getListofCheckDoutBooks(在用户ID中,在过期之外)。这可能会返回第一个?的某种标志,输出参数中的布尔值指示用户是否至少有一本过期的书,以及他们当前已签出的所有书的结果集。这对我不适用!squirrelsql:3.5.0错误消息:Error:db2sql错误:SQLCODE=-104,SQLSTATE=42601,SQLERRMC=NUMBER;声明输出参数;语句结束,驱动程序=3.53.95 SQLState:42601错误代码:-104在:DECLARE outParam NUMBERAgreed中发生错误。由于Declare在BEGIN之外,它抱怨这个数字不是预期的。如果我把它移到BEGIN中,它会抱怨BEGIN不是预期的。我将语句分隔符改为#,也没有运气。我猜您的答案适用于DB2/400I以外的一些DB。我在这里做了一些修复:1)声明需要在块内。2)
NUMBER
仅在启用了兼容性的情况下,在某些版本的DB2上才受支持。3) 语句后的
/
是特定于Oracle的。您需要更改Squirrel中的语句分隔符才能运行此操作。这应该适用于DB2了。我可以通过将分隔符设置为#,然后在存储过程名称前面添加“CALL”来实现这一点。但是,我无法查看结果集或out参数,因此这对我来说仍然不是一个有效的解决方案。这在调用存储过程时没有使用inOutParam。谢谢,这似乎很有效。我不能把它标为被接受,因为从技术上讲它不能回答原来的问题,但它是一个有用的答案,所以我把它投了赞成票。@KC Baltz:为什么这不是原来问题的正确答案?答案基本上是:你不能。在此之后,我只是展示了一个替代解决方案作为奖励:-)我只是试图让它工作,它给了我一个错误,“错误:[SQL0101]SQL语句太长或太复杂。SQLState:54001错误代码:-101”。
wbcall SOMESPROC(12345, ?);
begin
declare inoutParm numeric(2,0);
call spMyStoredProcedure(
             1234567                                     
           , inoutParm                                           
       );
declare global temporary table session.myTempTbl  
       (MyResult   char(1024) )                                         
with replace ;
insert into session.myTempTbl
  (myResult)
   values(inoutParm) ;  
end
~
select myResult from session.myTempTbl