我真的很喜欢将 SQuirreL SQL 作为 SQL 查询工具,但我从来没能让它调用我们的 AS/400 DB2 数据库中的存储过程。我总是收到错误“设置或注册的参数值的数量与参数的数量不匹配”。我已经仔细检查了参数的数量并且没有运气。这是我为接受一个 IN 和一个 OUT 的过程尝试的语法:
调用 SOMESPROC(12345, ?);
我真的很喜欢将 SQuirreL SQL 作为 SQL 查询工具,但我从来没能让它调用我们的 AS/400 DB2 数据库中的存储过程。我总是收到错误“设置或注册的参数值的数量与参数的数量不匹配”。我已经仔细检查了参数的数量并且没有运气。这是我为接受一个 IN 和一个 OUT 的过程尝试的语法:
调用 SOMESPROC(12345, ?);
SQuirrel 目前似乎无法在 AS/400 DB2 上执行此操作。
使用开源“SQL Workbench/J”(http://www.sql-workbench.net/)我能够调用一个过程:
wbcall SOMESPROC(12345, ?);
它有自己的命令用于调用过程“wbcall”。利用 ?用于输出参数。
注意:安装 SQL Workbench/J 时,请确保从IBM下载正确的 DB2 驱动程序,并在 SQL Workbench/J 中添加驱动程序时添加许可证文件。
在 Squirrel 中,你可以使用这样的东西。您需要确保声明变量的类型与存储过程中的 out 参数的类型相匹配。
BEGIN
DECLARE outParam INT;
STORED_PROC_NAME(outParam);
END
如果您还需要为程序提供输入,您可以这样做。
BEGIN
DECLARE outParam INT;
STORED_PROC_NAME('input', outParam);
END
您还需要将语句分隔符更改为;
. 否则它将破坏声明并尝试单独发送每件。
在 DbVisualizer 的专业版中,启用 SQL Commander 菜单选项下的“Process Parameter Markers in SQL”,它将允许“?” 参数
call SOMESPROC(12345, ?);
我认为如果有一个,那么调用应该是:
CALL SomeSProc(12345)
得到一个结果也许尝试:
SELECT * FROM SomeSProc(12345)
这是一个在 Squirrel 3.7 上使用 db2 存储过程的测试示例。诀窍是通过过渡存储过程 MY_PROC_TEST 调用真正的存储过程 PROC_TEST。
在 squirrel > session > session properties > 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()@
如果您更改分隔符(如上所述),这将在 Squirrel 中起作用。但是,要查看变量是什么,您需要执行以下操作...
在我的示例中,我将分隔符设置为波浪线 (~)。包括在最后一个“end”之后,“select”之前。代码从这里开始......
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 Developer
在 squirrel > session > session properties > SQL 中更改语句分隔符:'#'
BEGIN
DECLARE inOutParam varchar(200);
set inOutParam = 'a value';
STORED_PROC_NAME(outParam);
END;
#