PostgreSQL中的FOREACH参数名附近出现语法错误

pxy2qtax  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(2)|浏览(255)

所以,让我先说,我是一个完整的Noob当谈到SQL。
我在一个架构中得到了两个表:属性和技能。
我想自动为每个属性添加技能,因为我已经在属性表的"修改"列中获得了所有技能的名称,以及它们的属性。
函数的代码如下所示:

CREATE OR REPLACE FUNCTION AddSkFromList(p_Attr "Cyberpunk2020"."Attr", p_SkList text[]) RETURNS void AS $$
DECLARE
    v_SkName text;
BEGIN
    FOREACH v_SkName IN p_SkList LOOP
        INSERT INTO "Cyberpunk2020"."Skills" ("Attribute", "Name")
        VALUES (p_Attr, v_SkName);

    END LOOP;
END;
$$ LANGUAGE plpgsql;

这给了我语法错误:

ERROR:  syntax error at or near "p_SkList"
LINE 5: FOREACH v_SkName IN p_SkList LOOP
                            ^

很遗憾我无法理解为什么这个函数不起作用,根据Postgres文档,FOREACH语句需要一个目标和一个表达式,在所有的例子中,我都发现目标在Declare块[Duh]中被声明,表达式可以是任何类型的数组。但是错误是一样的。我是否从根本上误解了Postgres的一些东西,循环所经过的数组必须是预定义的?我还将search_path设置为相应的Shema,我想在其中创建函数,它与存放表的目录相同,正如您在下面看到的,我能够使用简单的\d+ $shema_name来访问表
"属性表"如下所示:

Table "Cyberpunk2020.Attributes"
  Column  |  Type  | Collation | Nullable | Default | Storage  | Stats target | Description
----------+--------+-----------+----------+---------+----------+--------------+-------------
 Attr     | "Attr" |           | not null |         | plain    |              |
 name     | text   |           |          |         | extended |              |
 Modifies | text[] |           |          |         | extended |              |
Indexes:
    "Attributes_pkey" PRIMARY KEY, btree ("Attr")
Child tables: public."Attributes"
Access method: heap

技能表如下所示:

\d+ "Skills"
                                  Table "Cyberpunk2020.Skills"
    Column    |  Type  | Collation | Nullable | Default | Storage  | Stats target | Description
--------------+--------+-----------+----------+---------+----------+--------------+-------------
 Attribute    | "Attr" |           | not null |         | plain    |              |
 Name         | text   |           | not null |         | extended |              |
 Desciption   | text   |           |          |         | extended |              |
 IPMultiplier | bigint |           |          | 1       | plain    |              |
 Modifies     | text[] |           |          |         | extended |              |
Indexes:
    "Skills_pkey" PRIMARY KEY, btree ("Attribute", "Name")
Child tables: public."Skills"
Access method: heap

Postgres版本

version
---------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 13.9 (Debian 13.9-0+deb11u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
(1 row)

提前感谢所有的指针在正确的方向,因为我是彻底困惑。
我希望函数循环给定的文本数组p_SkList,并将找到的名称和相应属性作为新行插入"Skills"

0sgqnhkj

0sgqnhkj1#

语法是IN ARRAY array_expr,而不是IN array_expr。- Laurenz Albe
这就是所有的错误,非常感谢,我现在觉得自己很盲目^^

alen0pnh

alen0pnh2#

类似这样的方法应该可以工作,使用UNNEST()从数组中获取所有元素,这样可以避免循环,也不需要plpgsql:

CREATE OR REPLACE FUNCTION AddSkFromList(p_Attr "Cyberpunk2020"."Attr", p_SkList text[]) 
RETURNS void 
LANGUAGE sql;
AS 
$$
    INSERT INTO "Cyberpunk2020"."Skills" ("Attribute", "Name")
    SELECT  p_Attr
        ,   v_SkName
    FROM    UNNEST(p_SkList) AS sub(v_SkName);
$$;

相关问题