![](/img/trans.png)
[英]What is the proper syntax for PostgreSQL stored procedures (functions)?
[英]Proper use of semicolons in functions and procedures
我不知道將分號放在以下結構中。 根據我對文檔的解釋,我嘗試在“ with as”之后都寫分號,但這是不對的:
CREATE OR REPLACE PROCEDURE insert_product(product_name VARCHAR, category_name VARCHAR)
LANGUAGE plpgsql
as $$
BEGIN
WITH ins_category AS(
INSERT INTO product_category(name)
VALUES(category_name)
ON CONFLICT (name) DO NOTHING
RETURNING id
)
WITH ins_product AS(
INSERT INTO product(name, product_category)
SELECT product_name, ins_category.id FROM ins_category
RETURNING sku
)
COMMIT;
END;
$$
這行得通,但我開始認為我無緣無故地添加了額外的分號:
CREATE OR REPLACE PROCEDURE insert_product(product_name VARCHAR, category_name VARCHAR)
LANGUAGE plpgsql
as $$
BEGIN
WITH ins_category AS(
INSERT INTO product_category(name)
VALUES(category_name)
ON CONFLICT (name) DO NOTHING
RETURNING id
)
INSERT INTO product(name, product_category)
SELECT product_name, ins_category.id FROM ins_category; //DO I NEED THE SEMICOLON HERE
COMMIT;
END;
$$
在第一個示例中,我需要第二個“ with as”,因為我想繼續該過程並將另一行插入到另一個相關表中。
答:我的問題在第一個示例中我為何需要在何處添加分號?
B.第二個中是否有多余的分號?
第二個表之前必須用逗號而不是分號。
CREATE OR REPLACE PROCEDURE insert_product(product_name VARCHAR, category_name VARCHAR)
LANGUAGE plpgsql
as $$
BEGIN
WITH ins_category AS(
INSERT INTO product_category(name)
VALUES(category_name)
ON CONFLICT (name) DO NOTHING
RETURNING id
),
ins_product AS(
INSERT INTO product(name, product_category)
SELECT product_name, ins_category.id FROM ins_category
RETURNING sku
)
<SELECT/INSERT/UPDATE/DELETE>
COMMIT;
END;
$$
CTE的語法為:
WITH <name> AS (
<SELECT or INSERT/UPDATE/DELETE ... RETURNING>
) [,
<name2> AS (
<SELECT or INSERT/UPDATE/DELETE ... RETURNING>
) [, ...] ]
<SELECT/INSERT/UPDATE/DELETE>
因此,如HereGoes的回答所述,CTE需要用逗號分隔。 它只是語法的一部分。
分號分隔不同的SQL語句,因此在SQL語句內寫分號(字符串文字或注釋中的字符除外) 始終是語法錯誤。
添加額外的分號的唯一可能方法是使兩個分號彼此相鄰,例如
SELECT 42;;
在這兩個分號之間是一個“空” SQL語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.