所以,我试图在一个简单的图书贷款系统上工作,我在创建和使用函数方面遇到了问题。
我有贷款'表',复制'表'和可用'查看'。
“可用视图”如下所示:
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的新手。请帮忙。 :(
答案 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;