2010-07-19 49 views
0

越来越接近运行我的第一个存储过程。这一次编译,但是当我 call test.fttest5('YEAR');运行它,它抛出一个错误这个存储过程有什么问题?

SQL状态:22001 供应商代码:-303 消息:[SQL0303] Host变量* N不兼容。原因。 。 。 。 。 :由于主机变量* N的数据类型与相应列表项的数据类型不兼容,因此无法执行FETCH,SELECT,CALL,SET,VALUES INTO,GET DIAGNOSTICS,GET DESCRIPTOR或SET DESCRIPTOR。

另外如何在我的存储过程中指定无限数据类型?我试过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

我相信你在这里得到的错误实际上是在你的程序被调用之前发生的。您已经使用一个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

+0

谢谢,我会研究你说的话,并保持这个线程张贴! – 2010-07-19 19:57:39

+0

想通了,谢谢。你在现场。 – 2010-07-21 11:17:04

1

选择*是坏的,特别是如果你是从复杂的或大的意见进行选择。

游标一般不好,因为您遍历每一行而不是使用集合。

还想一想这里是否需要动态SQL?

此存储过程的缺点是什么?它看起来很简单,我想知道是否可以使用集重写它,而不是用光标迭代?

+0

感谢您的回复,它只是一个示例声明和测试程序。实际的场景是长过滤器和搜索查询(DYNAMIC WHERE&ORDER BY)的动态where子句。现在我所知道的是,我必须使用光标来让我的存储过程正常工作,你能告诉我如何使用我的示例集? – 2010-07-19 11:57:10