簡體   English   中英

我可以在PL / pgSQL函數中的賦值中使用SQL語句嗎?

[英]Can I use an SQL statement in assignment inside a PL/pgSQL function?

我有這兩個表(Encomenda和Informacaofaturacao),我正在嘗試創建一個觸發器,在插入Encomenda之前在Informacaofaturacao上插入一個新行,並將新的Informacaofaturacao行的ID放在Encomenda的新行上。

我究竟做錯了什么?

謝謝

CREATE TABLE Encomenda
(
    EncomendaID SERIAL,
    ClienteID integer NOT NULL,
    MoradaFaturacaoID integer NOT NULL,
    MoradaEnvioID integer NOT NULL,
    InformacaofaturacaoID integer NULL,
    Data timestamp NOT NULL,
    Estado EstadoEncomenda NOT NULL DEFAULT 'Em processamento',
    CONSTRAINT PK_Encomenda PRIMARY KEY (EncomendaID)
)
;

CREATE TABLE Informacaofaturacao
(
    InformacaofaturacaoID SERIAL,
    MetodopagamentoID integer NULL,
    Portes real NULL,
    Iva real NULL,
    Total real NULL,
    CONSTRAINT PK_Informacaofaturacao PRIMARY KEY (InformacaofaturacaoID)
)
;

CREATE OR REPLACE FUNCTION insert_encomenda() 
RETURNS TRIGGER 
AS $$
BEGIN
    NEW.InformacaofaturacaoID := (INSERT INTO Informacaofaturacao RETURNING InformacaofaturacaoID);

    RETURN NEW;
END $$ LANGUAGE plpgsql;

CREATE TRIGGER insert_encomenda_trigger
BEFORE INSERT OR UPDATE ON Encomenda
FOR EACH ROW
    EXECUTE PROCEDURE insert_encomenda();

Postgres不接受在賦值時修改SQL語句(INSERT,UPDATE或DELETE)的數據。 文件說明:

...通過發送到主數據庫引擎的SQL SELECT命令來評估此類語句中的表達式。

您應該使用這種形式來執行具有單行結果的查詢

此外,INSERT命令必須具有VALUES部分,它可以是:DEFAULT VALUES,VALUES(...)或查詢, 請參閱文檔中的語法

CREATE OR REPLACE FUNCTION insert_encomenda() 
RETURNS TRIGGER 
AS $$
BEGIN
    INSERT INTO Informacaofaturacao(InformacaofaturacaoID) 
    VALUES(DEFAULT) 
    RETURNING InformacaofaturacaoID
    INTO NEW.InformacaofaturacaoID;

    RETURN NEW;
END $$ LANGUAGE plpgsql;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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