PostgreSQL 9.1 でコンテンツ格納用のテーブルを動的に作成するフレームワークを開発しています。API 関数の 1 つを使用すると、呼び出し元は、特定のオブジェクト (Web フォームなど) 内のすべてのフィールドを指定して、新しいコンテンツ エントリを保存できます。フィールドのセットを受け取るために、フレームワークは複合型を作成します。
次のコードを検討してください。
CREATE SEQUENCE seq_contents MINVALUE 10000;
CREATE TABLE contents (
content_id int8 not null,
is_edited boolean not null default false,
is_published boolean not null default false,
"Input1" varchar(60),
"CheckBox1" int2,
"TheBox" varchar(60),
"Slider1" varchar(60)
);
CREATE TYPE "contentsType" AS (
"Input1" varchar(60),
"CheckBox1" int2,
"TheBox" varchar(60),
"Slider1" varchar(60)
);
CREATE OR REPLACE FUNCTION push(in_all anyelement) RETURNS int8 AS $push$
DECLARE
_c_id int8;
BEGIN
SELECT nextval('seq_contents') INTO _c_id;
EXECUTE $$INSERT INTO contents
SELECT a.*, b.*
FROM (SELECT $1, true, false) AS a,
(SELECT $2.*) AS b$$ USING _c_id, in_all;
RETURN _c_id;
END;
$push$ LANGUAGE plpgsql;
さて、この関数を呼び出すには、次のように明示的なキャストを追加する必要があります。
SELECT push(('input1',1,'thebox','slider1')::"contentsType");
明示的なキャストを回避する方法はありますか? 外部の呼び出し元がキャストを処理しないようにしたいため、つまり、PostgreSQL 関数の背後にあるロジックを隠します。現在、私はそのようなエラーがあります:
SELECT push(('input1',1,'thebox','slider1'));
ERROR: PL/pgSQL functions cannot accept type record
CONTEXT: compilation of PL/pgSQL function "push" near line 1