这个存储过程有什么问题?

时间:2010-07-19 11:46:21

标签: stored-procedures db2 ibm-midrange

非常接近运行我的第一个存储过程。这个编译,但当我运行它   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
    ;

2 个答案:

答案 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呢?

这个存储过程的唯一目的是什么?它看起来很简单,我想知道你是否可以使用集合重写它,而不是用光标迭代?