我正在尝试创建以下函数,但它没有成功编译。我不确定问题出在哪里。这是我第一次尝试这个。有人可以指出错误吗?
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
我只是尝试将与给定proj_id相关联的名称作为逗号分隔值。
答案 0 :(得分:3)
虽然您可以编写单例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
的数据库)。你不需要在FOREACH中使用游标名称,除非你打算做DELETE FROM proj_dev_map WHERE CURRENT OF cursor1
或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后的注释掉的分号。