【问题标题】:Error creating an Informix function创建 Informix 函数时出错
【发布时间】:2012-10-10 23:13:30
【问题描述】:

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

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

【问题讨论】:

    标签: database stored-procedures informix


    【解决方案1】:

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

    【讨论】:

    • 谢谢,乔纳森!还有一个关于开发人员变量未初始化的问题。我得到 -696 错误代码。我初始化了它就消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2013-09-16
    • 2014-03-05
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多