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

uid単一の SELECT ステートメントを作成することはできますが、これら 2 つを 1 つのクエリに結合する必要があります。これは、値ではなく名前のみに関心があるためです。

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 の後に 1 つある場合があります。上記のコードは私のデータベースでコンパイルされました。現在のデータベース以外では関数を作成できないため、データベース名を省略しました (試してみたところ、Informix はこの表記法に反対しましたresourcesDELETE FROM proj_dev_map WHERE CURRENT OF cursor1またはを実行する場合を除き、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 に答える