【问题标题】:What's wrong with this stored procedure?这个存储过程有什么问题?
【发布时间】:2010-07-19 11:46:21
【问题描述】:

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

【问题讨论】:

    标签: stored-procedures db2 ibm-midrange


    【解决方案1】:

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

    【讨论】:

    • 谢谢你,我会调查你所说的并继续发布这个帖子!
    【解决方案2】:

    选择 * 是不好的,尤其是当您从复杂或大视图中进行选择时。

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

    另外想想这里是否需要动态SQL?

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

    【讨论】:

    • 感谢您的回复,这只是一个示例语句和一个测试程序。实际情况是长过滤器和搜索查询(DYNAMIC WHERE 和 ORDER BY)的动态 where 子句。我现在所知道的是我必须使用游标来让我的存储过程工作,你能告诉我如何在我的例子中使用集合吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多