0

因此,我尝试开发一个简单的图书借阅系统,但在创建和使用功能时遇到了问题。

我有一个贷款'表',副本'表'和可用的'视图'。

“可用视图”如下所示:

 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将提示您无法在Loans中借书的内容因为这本书已经售罄了。

我对plpgsql有点陌生。请帮忙。:(

4

2 回答 2

1

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

创建或替换函数 try(copyID TEXT)
返回布尔值 $$
开始
    SELECT available_copies FROM available - 缺少 INTO ???
    -- 未声明的变量“available_copies”,可能
    -- 与名为“available_copies”的列发生冲突
    IF available_copies > 0 THEN
       插入贷款(copy_id)值(copyID);
       返回布尔值;--- RETURN true or false, but BOOLEAN??
    别的
       返回布尔值;
    万一;
结尾;
$$ 语言 plpgsql;
于 2013-05-21T18:29:13.250 回答
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 EXISTSin 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;
于 2013-05-21T19:43:10.687 回答