非常接近运行我的第一个存储过程。这个编译,但当我运行它
call test.fttest5('YEAR');
它会抛出错误
SQL状态:22001 供应商代码:-303 消息:[SQL0303]主机变量* N不兼容。原因。 。 。 。 。 :无法执行FETCH,SELECT,CALL,SET,VALUES INTO,GET DIAGNOSTICS,GET DESCRIPTOR或SET DESCRIPTOR,因为主机变量* N的数据类型与相应列表项的数据类型不兼容。
另外,如何在存储过程中指定无限数据类型?我试过了DECLARE temp VARCHAR(MAX);
,但没有奏效。我的平台是 ISeries DB2 V5R4。
create procedure test.fttest5
(IN ftExpression CHARACTER(30))
language sql
reads sql data
dynamic result sets 1
begin
declare cmd VARCHAR(50);
declare whr VARCHAR(50)
;
declare x cursor for sl;
set cmd='select * from testSchema.tempTable' ;
if ftExpression IS NOT NULL
THEN
set whr= ftExpression;
END IF;
set cmd=cmd || CASE WHEN whr IS NULL THEN '' ELSE ' ORDER BY ' || whr END;
prepare sl from cmd;
open x;
return;
end
;
答案 0 :(得分:2)
我相信你在这里遇到的错误实际上是在你的程序被调用之前发生的。你已经使用一个CHAR参数定义了这个过程,但你用VARCHAR调用它。当您以交互方式键入SQL时,参数将以VARCHAR形式出现。
尝试按照以下方式调用它:call test.fttest5(CHAR('YEAR'))
或者您也可以将参数更改为VARCHAR,但您仍然希望测试使用CHAR调用它以查看会发生什么。
但是我认为你错过了SET RESULT SETS CURSOR x
行。我也会在宣布之前做好准备,因为我认为订单可能很重要。
IBM文档位于http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/topic/rzaik/rzaikspresultsets.htm。
答案 1 :(得分:1)
选择*是不好的,特别是如果您从复杂或大视图中进行选择。
游标一般都很糟糕,因为你遍历每一行,而不是使用集合。
还要考虑是否需要动态SQL呢?
这个存储过程的唯一目的是什么?它看起来很简单,我想知道你是否可以使用集合重写它,而不是用光标迭代?