POSTGRES:功能问题

时间:2013-05-21 17:57:23

标签: function postgresql plpgsql

所以,我试图在一个简单的图书贷款系统上工作,我在创建和使用函数方面遇到了问题。

我有贷款'表',复制'表'和可用'查看'。

“可用视图”如下所示:

 book_id | available_copies
---------+------------------
 BI6     |                1

其中'available_copies'列是

COUNT(copy_id) AS available_copies 
FROM copies 
WHERE copy_id NOT IN (SELECT copy_id FROM loans)

这是我的“副本表”

 copy_id | book_id | copy_no | copy_code
---------+---------+---------+-----------
 CI8     | BI6     |       8 | CI
 CI9     | BI6     |       9 | CI
 CI7     | BI7     |       7 | CI
 CI10    | BI7     |      10 | CI

这是我的“贷款表”

 loan_id | copy_id | user_id | borrow_date |  due_date  | loan_no | loan_code
---------+---------+---------+-------------+------------+---------+-----------
 LI10    | CI10    | UI4     | 2013-05-21  | 2013-05-26 |      10 | LI
 LI11    | CI8     | UI4     | 2013-05-21  | 2013-05-26 |      11 | LI
 LI12    | CI7     | UI4     | 2013-05-22  | 2013-05-27 |      12 | LI

我真正想做的是..如果available_copies为0(如上面的“可用视图”,BI7不再在可用视图中,因为已经借用的所有副本)postgres将提示您无法借用的内容因为这本书已经没有复制品了,所以还有书中的贷款。

我是plpgsql的新手。请帮忙。 :(

2 个答案:

答案 0 :(得分:1)

我不知道你有什么Pg版本,但可能还有一些旧版本。我在你的例子中看到了很多错误 - 所以我不相信它被postgres接受

CREATE OR REPLACE FUNCTION try(copyID TEXT)
RETURNS BOOLEAN AS $$
BEGIN
    SELECT available_copies FROM available -- missing INTO ??? 
    -- Undeclared variable "available_copies" and probably
    -- collision with column named "available_copies" 
    IF available_copies > 0 THEN 
       INSERT INTO loans(copy_id) VALUES(copyID);
       RETURN BOOLEAN; --- RETURN true or false, but BOOLEAN??
    ELSE
       RETURN BOOLEAN;
    END IF;
END;
$$ LANGUAGE plpgsql;

答案 1 :(得分:0)

PL / SQL函数示例:

CREATE OR REPLACE FUNCTION try(copyID TEXT)
RETURNS BOOLEAN AS $$
BEGIN
    RETURN NOT EXISTS (SELECT l.copy_id FROM loans l WHERE l.copy_id = copyID);
END;
$$ LANGUAGE plpgsql;

如果在RETURN中有TRUE copyID的记录,则会NOT EXISTS loans

与SQL函数相同的功能:

CREATE OR REPLACE FUNCTION try(copyID TEXT)
RETURNS BOOLEAN AS $$
    SELECT NOT EXISTS (SELECT l.copy_id FROM loans l WHERE l.copy_id = copyID)
$$ LANGUAGE SQL;