我试图在PostgreSQL中将 SET 与 SELECT 一起使用,但似乎出现了错误:
CREATE FUNCTION "GET_READ_AUTHORITY_BITS_3" (RoleBO TEXT)
RETURNS TEXT
AS
$BODY$
DECLARE
DECLARE READ_AUTHORITY_BITS TEXT;
BEGIN
SET READ_AUTHORITY_BITS = SELECT OVERLAY('Apple' placing '' from 1 for 1);
END
$BODY$
LANGUAGE plpgsql VOLATILE
错误:
错误:“ SELECT”处或附近的语法错误LINE 8:SET READ_AUTHORITY_BITS = SELECT OVERLAY('Apple'放置... ^ SQL状态:42601字符:164
但是 SET 和 SELECT 分别可以正常工作:
CREATE FUNCTION "GET_READ_AUTHORITY_BITS_2" (RoleBO TEXT)
RETURNS TEXT
AS
$BODY$
DECLARE
DECLARE READ_AUTHORITY_BITS TEXT;
BEGIN
SET READ_AUTHORITY_BITS = 'a';
SELECT OVERLAY('Apple' placing '' from 1 for 1);
END
$BODY$
LANGUAGE plpgsql VOLATILE
我在这里想念东西吗?
答案 0 :(得分:2)
SET
不能用于设置plpgsql函数变量。用于设置运行时配置参数。参见documentation。
如果您想将OVERLAY
函数的结果分配给变量,则可以通过多种方式实现:
CREATE FUNCTION "GET_READ_AUTHORITY_BITS_3" (RoleBO TEXT)
RETURNS TEXT
AS
$BODY$
DECLARE
READ_AUTHORITY_BITS TEXT;
BEGIN
-- 1.
READ_AUTHORITY_BITS := OVERLAY('Apple' placing '' from 1 for 1);
-- 2.
READ_AUTHORITY_BITS := (SELECT OVERLAY('Apple' placing '' from 1 for 1));
-- 3.
SELECT OVERLAY('Apple' placing '' from 1 for 1)
INTO READ_AUTHORITY_BITS;
END
$BODY$
LANGUAGE plpgsql VOLATILE
答案 1 :(得分:1)
我不知道是否可以通过这种方式使用SET,也许您可以使用EXECUTE来做到这一点:
EXECUTE format('SET READ_AUTHORITY_BITS = %L', OVERLAY('Apple' placing '' from 1 for 1));
我敢肯定,您可以使用并获得相同的结果是使用set_config:
PERFORM set_config('READ_AUTHORITY_BITS', OVERLAY('Apple' placing '' from 1 for 1), false);
顺便说一句,您的第二个示例肯定会引发错误,即SELECT语句没有目标。
好吧,我再次阅读了您的问题,似乎您不想使用SET setting = value
,而是设置了function变量。以防万一。否则,请阅读卢卡斯的评论。