首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Informix : For循环

Informix : For循环
EN

Stack Overflow用户
提问于 2012-03-16 14:29:44
回答 1查看 5.8K关注 0票数 1

我必须编写一个存储的proc,它将接受以逗号分隔的电影in字符串,并将从dB获得一个电影名称列表。我试过了,但我不确定语法是否正确,很明显,db Vis正在抛出语法错误。

Pl.Help。

代码语言:javascript
复制
  Code:

CREATE PROCEDURE test_sp() returning VARCHAR(255);
begin


define set_movieIds, t_movieNames varchar(255);
define t_movieID varchar(5);
define t_count, t_length integer;


let set_movieIds = '54565' ||',' || '55258' || ',' || '55711' || ',' ||'52719' || ',';
let t_length = length(set_movieIds);

for t_count IN (0 TO t_length) loop
        IF(set_movieIds[t_count] is not ',')
                THEN

                 for t_count in (t_count to t_count+4)
                     let t_movieID[t_count] = set_movieIds[t_count]
                 end for;

                select movie_name into t_movieNames 
                from tbl_cinemasource_movieinfo 
                where movie_id = t_movieID      
                let t_movieNames = t_movieNames || ',';

        end if;


exit when t_count = t_length;
end loop;


return t_movieNames;
end;
END PROCEDURE;
EN

回答 1

Stack Overflow用户

发布于 2012-03-19 14:53:05

这里有各种各样的问题。

代码语言:javascript
复制
CREATE PROCEDURE test_sp() returning VARCHAR(255);

    begin

这个BEGIN不是具体错误的,但它是常规的和不必要的。

代码语言:javascript
复制
    define set_movieIds, t_movieNames varchar(255);
    define t_movieID varchar(5);
    define t_count, t_length integer;

    let set_movieIds = '54565' ||',' || '55258' || ',' || '55711' || ',' ||'52719' || ',';

为什么不只是一个简单的文字呢?为什么是后缀逗号?然而,这些都是表面问题,而不是功能性问题。

代码语言:javascript
复制
    let t_length = length(set_movieIds);

    for t_count IN (0 TO t_length) loop

这不是Informix (存储过程语言)中支持的符号。您可以编写一个更常规的循环如下:

代码语言:javascript
复制
    FOR t_count = 0 TO t_length

继续..。

代码语言:javascript
复制
        IF (set_movieIds[t_count] is not ',') THEN

IS NOT之后几乎必须是NULL (虽然标准SQL也允许TRUEFALSEUNKNOWN )。但是无论如何,你都在寻找一个“不等于”的运算符。括号是可选的。

代码语言:javascript
复制
        IF set_movieIds[t_count] != ',' THEN

补充: SPL的一个不太令人满意的特性是,使用下标符号编写的字符串下标只能有常量整数作为下标。幸运的是,有一种解决问题的方法,使用SUBSTR()函数来代替:

代码语言:javascript
复制
        IF SUBSTR(set_movieIds, t_count, 1) != ',' THEN

继续..。

代码语言:javascript
复制
             for t_count in (t_count to t_count+4)

在语法上,这应该是:

代码语言:javascript
复制
             FOR t_count = t_count TO t_count+4

语义上,这让我头疼。这个内环需要一个额外的变量;

代码语言:javascript
复制
             FOR u_count = t_count TO t_count+4

继续..。

代码语言:javascript
复制
                 let t_movieID[t_count] = set_movieIds[t_count]
             end for;

我不清楚你想抄袭什么。我认为您可能需要一个从1开始的变量(我称之为v_count)和u_count,然后:

代码语言:javascript
复制
                 LET t_movieID[v_count] = set_movieIds[u_count];
                 LET v_count = v_count + 1;

这也需要调整。

在LET之后,如果没有分号,你可能会没事,但你可能不会。那里的矛盾让我发疯了。

继续..。

代码语言:javascript
复制
            select movie_name into t_movieNames 
            from tbl_cinemasource_movieinfo 
            where movie_id = t_movieID    

在SELECT语句之后需要一个分号。

代码语言:javascript
复制
            let t_movieNames = t_movieNames || ',';

        end if;

    exit when t_count = t_length;

这个表示法不是SPL的一部分。你得写:

代码语言:javascript
复制
    IF t_count = LENGTH THEN EXIT FOR; END IF;

(你可能不需要这两个分号。)OTOH,您还将进入FOR循环的下一个周期。随着上述u_count的引入,您可能需要调整t_count

代码语言:javascript
复制
    end loop;

必须写END FOR来结束FOR循环;写end IF结束IF语句;写END XYZ结束XYZ构造。至少这一点是一致的。

代码语言:javascript
复制
    return t_movieNames;
    end;

END PROCEDURE;

关于什么是什么的解剖就这么多了。这么说,感觉真的很不舒服。我通常希望编写一个粗略的过程,将每个电影标题作为一个单独的结果返回。我也希望使用字符串以外的其他东西来描述要选择的电影。由于列表在这里是硬编码的,所以我会修改SELECT语句以使用IN列表。如果列表是可变的,我将使用一个临时表,该表中填充了我所追求的电影ID。将在此过程之外创建。或者,假设您使用的是当前版本的(而不是IDS7.x或OnLine 5.20),那么您可以使用一组整数(或VARCHAR(5))值来描述电影列表。

因此,在最简单的情况下,我会:

代码语言:javascript
复制
CREATE PROCEDURE test_sp() RETURNING VARCHAR(255) AS movieName;

    DEFINE t_movieNames varchar(255);

    FOREACH SELECT movie_name
              INTO t_movieNames 
              FROM tbl_cinemasource_movieinfo 
             WHERE movie_id IN (54565, 55258, 55711, 52719)
        RETURN t_movieNames WITH RESUME;
    END FOREACH;

END PROCEDURE;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9739119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档