簡體   English   中英

在函數和過程中正確使用分號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM