web-dev-qa-db-ja.com

別の関数から関数を作成する

別のplpgsql関数から新しい関数を作成することは可能ですか?このようなもの:

CREATE OR REPLACE FUNCTION func_test()
RETURNS VOID AS
$BODY$
BEGIN
  CREATE OR REPLACE FUNCTION func_test2()
  RETURNS INT AS
  BEGIN
  $$
    SELECT 1;
  $$
  END
END
$BODY$
LANGUAGE plpgsql;

上記のコードを実行すると、次のようになります。

ERROR:  unexpected end of function definition at end of input
LINE 13: $BODY$`
4
Skeeve

はい、完全に可能です。ランダムな構文エラーがいくつかあります。

また、Postgresにはストアドプロシージャがないため、クエリの「ストアドプロシージャ」という用語を「関数」に自由に置き換えることができました。機能だけ-ほとんど同じですが、まったく同じではありません。

これはうまくいくでしょう:

CREATE OR REPLACE FUNCTION func_test()
  RETURNS VOID AS
$func$
BEGIN
  CREATE OR REPLACE FUNCTION func_test2()
     RETURNS INT AS
  $$
    SELECT 1
  $$ LANGUAGE sql;
END
$func$ LANGUAGE plpgsql;

または:

CREATE OR REPLACE FUNCTION func_test()
  RETURNS VOID AS
$func$
BEGIN

CREATE OR REPLACE FUNCTION func_test2()
  RETURNS INT AS
$$
BEGIN
   RETURN (SELECT 1);
END
$$ LANGUAGE plpgsql;

END
$func$ LANGUAGE plpgsql;

比較:

6