我非常喜欢SQuirreL SQL作为SQL查询工具,但我从未能够让它调用我们AS/400 DB2数据库中的存储过程。我总是会收到错误消息“设置或注册的参数值数量与参数数量不匹配”。我已经仔细检查了参数数量,但没有成功。这是我尝试过的一个带有一个IN和一个OUT参数的存储过程的语法:
call SOMESPROC(12345, ?);
我非常喜欢SQuirreL SQL作为SQL查询工具,但我从未能够让它调用我们AS/400 DB2数据库中的存储过程。我总是会收到错误消息“设置或注册的参数值数量与参数数量不匹配”。我已经仔细检查了参数数量,但没有成功。这是我尝试过的一个带有一个IN和一个OUT参数的存储过程的语法:
call 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中时添加许可文件。
BEGIN
DECLARE outParam INT;
STORED_PROC_NAME(outParam);
END
BEGIN
DECLARE outParam INT;
STORED_PROC_NAME('input', outParam);
END
你还需要将语句分隔符更改为除 ;
以外的其他内容。否则它会将语句分开并尝试单独发送每个片段。
DECLARE
需要在块内部。2)只有在启用兼容性时,NUMBER
才支持DB2的某些版本。3)语句后面的/
是Oracle特定的。您需要更改Squirrel中的语句分隔符才能运行此语句。现在应该适用于DB2。 - user1919238call SOMESPROC(12345, ?);
通过反复试验,我能够在Squirrel中看到结果。
create or replace variable var4 char(1);
create or replace variable var5 decimal(3,0);
create or replace variable var6 char(60);
call getthedata('XXX',123456789,'1234567',var4,var5,var6);
select var4,var5,var6 from sysibm.sysdummy1; -- displays OUT parms
我认为如果有一个输入,那么调用应该是:
CALL SomeSProc(12345)
要获得结果,可以尝试:
SELECT * FROM SomeSProc(12345)
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 @
然后你可以像这样调用存储过程:
CALL 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
Mic Keeley 作为AS400(DB2)SQL开发人员
我能够将所有上述答案的一些混合物拼凑在一起,并想出了这个对我有效的解决方案。我正在使用Squirrel SQL 2018连接到IBM AS/400 DB2数据库。我确实需要声明一个语句分隔符,我使用了“#”。
BEGIN
DECLARE success CHAR(1); -- output parameters
DECLARE message CHAR(300);
SET success = ' ';
SET message = ' ';
CALL myProc('some', 'params', 4, success, message);
DECLARE GLOBAL TEMPORARY TABLE session.myTmp(s_res CHAR(1), m_res CHAR(300)) WITH REPLACE;
INSERT INTO session.myTmp(s_res, m_res) VALUES(success, message);
END
# -- <- statement separator needs to be set to something other than ";" in this case it's set to "#"
SELECT * FROM session.myTmp;
在Squirrel > 会话 > 会话属性 > SQL中更改语句分隔符:'#'
BEGIN
DECLARE inOutParam varchar(200);
set inOutParam = 'a value';
STORED_PROC_NAME(outParam);
END;
#