所以,让我先说,我是一个完整的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"
2条答案
按热度按时间0sgqnhkj1#
语法是IN ARRAY array_expr,而不是IN array_expr。- Laurenz Albe
这就是所有的错误,非常感谢,我现在觉得自己很盲目^^
alen0pnh2#
类似这样的方法应该可以工作,使用UNNEST()从数组中获取所有元素,这样可以避免循环,也不需要plpgsql: