私は、PostgreSQL 9.1でコンテンツストレージ用のテーブルを動的に作成するフレームワークを開発中です。 API関数の1つは、呼び出し元が指定されたオブジェクト(たとえば、Webフォーム)内のすべてのフィールドを指定することによって、新しいコンテンツエントリを保存できるようにします。一連のフィールドを受け取るために、フレームワークは複合型を作成します。このような私は明示的なキャストを追加する必要があり、この関数を呼び出すために、今すぐplpgsql関数で複合型の明示的なキャストを避けることはできますか?
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
「PL/pgSQL関数は型レコードを受け取ることができません」というエラーに基づいて、これはPL/pgSQLの問題であると想定しています。だからオプションの1つがCでこの機能を作っているかもしれません。 – vyegorov