在PostgreSQL中使用SELECT进行设置不起作用

时间:2019-06-13 09:18:19

标签: postgresql

我试图在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

我在这里想念东西吗?

2 个答案:

答案 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变量。以防万一。否则,请阅读卢卡斯的评论。