我正在开发一个为PostgreSQL 9.1上的内容存储动态创建表的框架。其中一个API函数允许调用者通过指定给定对象(比如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问题。所以其中一个选项可能是C中的这个功能。 – vyegorov 2012-04-07 14:22:49