2

我正在尝试创建以下函数,但它没有成功编译。我不确定问题出在哪里。这是我第一次尝试这个。有人可以指出错误吗?

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 关联的名称作为逗号分隔值。

4

1 回答 1

4

尽管您可以编写单例 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 后注释掉的分号。

于 2012-10-11T00:36:37.780 回答