我必须编写一个存储的proc,它将接受以逗号分隔的电影in字符串,并将从dB获得一个电影名称列表。我试过了,但我不确定语法是否正确,很明显,db Vis正在抛出语法错误。
Pl.Help。
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;发布于 2012-03-19 14:53:05
这里有各种各样的问题。
CREATE PROCEDURE test_sp() returning VARCHAR(255);
begin这个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这不是Informix (存储过程语言)中支持的符号。您可以编写一个更常规的循环如下:
FOR t_count = 0 TO t_length继续..。
IF (set_movieIds[t_count] is not ',') THENIS NOT之后几乎必须是NULL (虽然标准SQL也允许TRUE、FALSE或UNKNOWN )。但是无论如何,你都在寻找一个“不等于”的运算符。括号是可选的。
IF set_movieIds[t_count] != ',' THEN补充: SPL的一个不太令人满意的特性是,使用下标符号编写的字符串下标只能有常量整数作为下标。幸运的是,有一种解决问题的方法,使用SUBSTR()函数来代替:
IF SUBSTR(set_movieIds, t_count, 1) != ',' THEN继续..。
for t_count in (t_count to t_count+4)在语法上,这应该是:
FOR t_count = t_count TO t_count+4语义上,这让我头疼。这个内环需要一个额外的变量;
FOR u_count = t_count TO t_count+4继续..。
let t_movieID[t_count] = set_movieIds[t_count]
end for;我不清楚你想抄袭什么。我认为您可能需要一个从1开始的变量(我称之为v_count)和u_count,然后:
LET t_movieID[v_count] = set_movieIds[u_count];
LET v_count = v_count + 1;这也需要调整。
在LET之后,如果没有分号,你可能会没事,但你可能不会。那里的矛盾让我发疯了。
继续..。
select movie_name into t_movieNames
from tbl_cinemasource_movieinfo
where movie_id = t_movieID 在SELECT语句之后需要一个分号。
let t_movieNames = t_movieNames || ',';
end if;
exit when t_count = t_length;这个表示法不是SPL的一部分。你得写:
IF t_count = LENGTH THEN EXIT FOR; END IF;(你可能不需要这两个分号。)OTOH,您还将进入FOR循环的下一个周期。随着上述u_count的引入,您可能需要调整t_count。
end loop;必须写END FOR来结束FOR循环;写end IF结束IF语句;写END XYZ结束XYZ构造。至少这一点是一致的。
return t_movieNames;
end;
END PROCEDURE;关于什么是什么的解剖就这么多了。这么说,感觉真的很不舒服。我通常希望编写一个粗略的过程,将每个电影标题作为一个单独的结果返回。我也希望使用字符串以外的其他东西来描述要选择的电影。由于列表在这里是硬编码的,所以我会修改SELECT语句以使用IN列表。如果列表是可变的,我将使用一个临时表,该表中填充了我所追求的电影ID。将在此过程之外创建。或者,假设您使用的是当前版本的(而不是IDS7.x或OnLine 5.20),那么您可以使用一组整数(或VARCHAR(5))值来描述电影列表。
因此,在最简单的情况下,我会:
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;https://stackoverflow.com/questions/9739119
复制相似问题