创建声明预定义文本数组的函数

Eds*_*ior 3 arrays postgresql function plpgsql declare

我需要在Postgres中创建一个函数,我声明的变量之一是预定义的文本数组,但我不知道设置其值的语法.这是我到目前为止:

CREATE OR REPLACE FUNCTION testFunction() RETURNS text
AS $$
DECLARE
    TESTARRAY TEXT['value 1', 'value 2', 'value 3'];
BEGIN
    return 'any text';
END;
$$ LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

我执行代码时遇到此错误:

ERROR:  syntax error at or near "'value 1'"
LINE 5: TESTARRAY TEXT['value 1', 'value 2', 'value 3'];
Run Code Online (Sandbox Code Playgroud)

poz*_*ozs 11

默认值的正确语法(在变量声明中)是.{ DEFAULT | := } expression

对于expression,您可以使用任何数组输入.

F.ex. 这些可以工作:

DECLARE
  test1  TEXT ARRAY  DEFAULT  ARRAY['value 1', 'value 2', 'value 3'];
  test2  TEXT[]      :=       '{"value 1", "value 2", "value 3"}';
  test3  TEXT[]      DEFAULT  ARRAY[]::TEXT[]; -- empty array-constructors need a cast
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 6

@pozs已经给出了正确的答案。

此外,当对正确的语法有疑问时,您可以向 Postgres 询问字符串文字

test=# SELECT ARRAY['value 1', 'value 2', 'value 3'];
              array
---------------------------------
 {"value 1","value 2","value 3"}

test=# SELECT  ARRAY['foo', 'bar', 'b A "Z'];
        array
---------------------
 {foo,bar,"b A \"Z"}
Run Code Online (Sandbox Code Playgroud)

每种类型的每个可能值都有一个字符串表示。

要获得易于引用的版本,该版本处理所有可能的极端情况,请将其包装在quote_nullable()

test=# SELECT quote_nullable(ARRAY['value 1', 'value 2', 'value 3']);
          quote_nullable
-----------------------------------
 '{"value 1","value 2","value 3"}'

test=# SELECT quote_nullable(ARRAY['foo', 'bar', 'b ''A'' "Z"']);
         quote_nullable
--------------------------------
 E'{foo,bar,"b ''A'' \\"Z\\""}'
Run Code Online (Sandbox Code Playgroud)

你的例子:

CREATE OR REPLACE FUNCTION test_function()
  RETURNS text AS
$func$
DECLARE
   testarray text[] := '{"value 1","value 2","value 3"}';
BEGIN
   RETURN 'any text';
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

其他要点

  • 不要引用语言名称:LANGUAGE plpgsql.
  • 在 Postgres 中使用小写标识符。根据文档:

    所有关键字都不区分大小写。除非双引号,否则标识符会隐式转换为小写,就像在普通 SQL 命令中一样。