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 はこの表記法に反対しましたresources
。DELETE 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 の後のコメントアウトされたセミコロンです。