gpt4 book ai didi

postgresql - 是否可以避免在 plpgsql 函数中对复合类型进行显式转换?

转载 作者:行者123 更新时间:2023-11-29 13:06:26 27 4
gpt4 key购买 nike

我正在开发一个框架,该框架可以在 PostgreSQL 9.1 上动态创建内容存储表。 API 函数之一允许调用者通过指定给定对象(例如 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

最佳答案

您是否考虑过将记录变量作为其文本表示 传递?理论上,每个记录变量都可以使用普通的 CAST 运算符与文本相互转换。

下面是修改后的函数,因此 in_all 的类型为 text 并在 USING 子句中转换为 "contentsType":

CREATE OR REPLACE FUNCTION push(in_all text) 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::"contentsType";

RETURN _c_id;
END;
$push$ LANGUAGE plpgsql;

然后可以这样调用(没有显式引用类型)

select push( '(input1,1,thebox,slider1)' );

或类似的(显式记录转换为文本)

SELECT push(('input1',1,'thebox','slider1')::"contentsType"::text);

这不仅适用于“contentsType”,而且适用于任何其他记录类型,前提是该函数能够将其转换回该类型。

同样在 plpgsql 中,我认为这也应该有效:

   ret := push(r::text);

当 r 是记录变量时。

关于postgresql - 是否可以避免在 plpgsql 函数中对复合类型进行显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10053155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com