尽管您可以编写单例 SELECT 语句,但无论如何您都应该将这两个语句组合成一个查询,因为您只对名称感兴趣,而不对uid
值感兴趣。
CREATE FUNCTION get_developers (proj_id varchar(10))
RETURNING varchar(50);
DEFINE developers varchar(200);
DEFINE dev_name varchar(50);
FOREACH SELECT u.user_name
INTO dev_name
FROM proj_dev_map AS p JOIN user AS u ON u.uid = p.user_attuid
WHERE p.project_id = proj_id
LET developers = developers || dev_name || ', ';
END FOREACH
RETURN developers;
END FUNCTION
SPL 语法对分号也很奇怪/挑剔。SELECT 语句后(LET 前)不能有分号。您可能在 END FOREACH 之后有一个。上面的代码在我的数据库上编译。我省略了数据库名称,因为您不能在除当前数据库之外的任何东西中创建函数(我尝试过 Informix 反对这种表示法——而不是我没有名为 的数据库这一事实resources
)。DELETE FROM proj_dev_map WHERE CURRENT OF cursor1
除非您要执行or ,否则您不需要 FOREACH 中的游标名称UPDATE proj_dev_map SET ... WHERE CURRENT OF cursor1
,尽管它并没有真正的危害。
resources
对代码进行编译(在数据库中)的最小更改是:
CREATE FUNCTION resources:get_developers (proj_id varchar(10))
RETURNING varchar(50);
DEFINE developers varchar(200);
DEFINE uid varchar(15);
DEFINE dev_name varchar(50);
FOREACH cursor1 FOR
select dev_user_id into uid from proj_dev_map where project_id = proj_id -- ;
select user_name into dev_name from user where user_attuid = uid;
LET developers = developers || dev_name || ', ';
END FOREACH
RETURN developers;
END FUNCTION
不同之处在于第一个 SELECT 后注释掉的分号。