ユーザー定義型に強く依存しているため、pl/pgsqlではこれが可能だとは思いません。悲しいことに、この言語は型の自動検出には十分にスマートではありません...私が使用する最初の可能な解決策は、少なくともテーブル列の型変更によってすべての関数を手動でリファクタリングする必要がないため、問題を部分的に解決すると思います.
1.) 列の種類を尋ねることで考えられる解決策:
CREATE FUNCTION test ()
RETURNS TABLE (id "user".user_id%TYPE, name "user".user_name%TYPE, email "user".user_email%TYPE)
AS
$BODY$
BEGIN
return QUERY SELECT
"user".user_id, "user".user_name, "user".user_email
FROM
"user";
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
これにより、少なくともタイプは冗長ではありません。最高ではありませんが、許容範囲です。
2.) SETOF RECORD で可能な解決策:
CREATE FUNCTION test ()
RETURNS SETOF RECORD
AS
$BODY$
BEGIN
RETURN QUERY SELECT
"user".user_id AS id, "user".user_name AS name, "user".user_email AS email
FROM
"user";
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
列タイプ定義リストがないと、次のエラーが発生しました。
エラー: 「レコード」を返す関数には列定義リストが必要です
したがって、次のように使用する必要があります。
SELECT * FROM test() AS (id INT, name VARCHAR, email VARCHAR);
これの代わりに:
SELECT * FROM test()
PHPクライアントによってすべての列を文字列で取得したため、列タイプの定義は役に立たない...このソリューションは、列タイプの定義なしで最適ですが、受け入れられません。
これを表のように使用できます。
CREATE FUNCTION test (OUT id "user".user_id%TYPE, OUT name "user".user_name%TYPE, OUT email "user".user_email%TYPE)
RETURNS SETOF RECORD
AS
$BODY$
BEGIN
RETURN QUERY SELECT
"user".user_id, "user".user_name, "user".user_email
FROM
"user";
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
たとえば、すべてを TEXT に設定できます。
CREATE FUNCTION test (OUT id TEXT, OUT name TEXT , OUT email TEXT )
RETURNS SETOF RECORD
AS
$BODY$
BEGIN
RETURN QUERY SELECT
"user".user_id::TEXT , "user".user_name::TEXT , "user".user_email::TEXT
FROM
"user";
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
これは機能しますが、これはタイプの自動検出とはほど遠いものであり、多くの冗長なテキスト コンバーター コードが生成されます...
3.) refcursor を使用した可能な解決策:
CREATE FUNCTION test ()
RETURNS SETOF "user"
AS
$BODY$
DECLARE
refc "user";
BEGIN
FOR refc IN
SELECT
"user".user_id, "user".user_name, "user".user_email
FROM
"user"
LOOP
RETURN NEXT refc;
END LOOP ;
RETURN ;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
これにより、不足している列にnull値が入力され、列に名前を付けることができず、SQLループが非常に遅くなります...したがって、これは受け入れられません。
refcursors には別の方法があります: refcursor 自体を返す方法ですが、通常の変数として使用できないため受け入れられません。カーソル名として文字列を指定する必要があります...ところで、refcursor 自体を使用することができませんでしたその結果、phpstorm が発生します。jdbc cursor not found エラーが発生しました。名前を間違って設定したのかもしれませんが、わかりません。これ以上努力する価値はないと思います。