2015-12-02 60 views
0

不确定的专栏中,我将在Orderlist一排这个触发时收到错误:的Postgres在触发

ERROR: column "qty_in_stock" does not exist 
LINE 1: SELECT qty_in_stock > 0 
     ^
QUERY: SELECT qty_in_stock > 0 
CONTEXT: PL/pgSQL function books_upd() line 6 at CASE 
****** Error ********** 

ERROR: column "qty_in_stock" does not exist 
SQL state: 42703 
Context: PL/pgSQL function books_upd() line 6 at CASE 

这里是我的代码:

INSERT INTO orderlist VALUES (12,1235,6) 

CREATE OR REPLACE FUNCTION books_upd() 
RETURNS trigger as $bookupd$ 
BEGIN 
UPDATE books 
SET qty_in_stock=qty_in_stock - NEW.quantity 
WHERE isbn=NEW.isbn; 
CASE WHEN qty_in_stock > 0 THEN 
UPDATE stockmanager 
set quantity=quantity+NEW.quantity 
WHERE isbn=NEW.isbn; 
END CASE; 

RETURN NEW; 
END; 
$bookupd$ LANGUAGE plpgsql; 

为把周围qty_in_stock引号许多论坛的建议 - 同样的错误。

表信息:

表的书籍: “” ISBN “” - PK “” 标题 “” “” 作家 “” “” qty_in_stock “” “” 价格 “” “” 成本” “ ”“ 今年发布的”” “” 的publisherId “”

表stockmanager: “” 国际标准书号 “” - PK,FK “” 数量 “与”

任何帮助表示赞赏。

回答

1

您不能像这样使用CASE语句,也不能在SQL语句之外引用表的列。您需要做的是将新值存储在变量中,然后将其与if声明一起使用:

CREATE OR REPLACE FUNCTION books_upd() 
    RETURNS trigger as 
$bookupd$ 
DECLARE 
    l_qty integer; 
BEGIN 
    UPDATE books 
    SET qty_in_stock = qty_in_stock - NEW.quantity 
    WHERE isbn=NEW.isbn 
    RETURNING qty_in_stock INTO l_qty; 

    if l_qty > 0 THEN 
    UPDATE stockmanager 
     set quantity= quantity + NEW.quantity 
    WHERE isbn = NEW.isbn; 
    END IF; 

    RETURN NEW; 
END; 
$bookupd$ 
LANGUAGE plpgsql; 
相关问题