创建Informix函数时出错

时间:2012-10-10 23:13:31

标签: database stored-procedures informix

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

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

1 个答案:

答案 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 cursor1UPDATE 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后的注释掉的分号。