Function 博士后:关于函数的问题

Function 博士后:关于函数的问题,function,postgresql,plpgsql,Function,Postgresql,Plpgsql,所以,我正在尝试一个简单的图书借阅系统,但在创建和使用函数时遇到了问题 我有一个贷款“表”,副本“表”和可用的“视图” 可用视图如下所示: book_id | available_copies ---------+------------------ BI6 | 1 其中“可用拷贝数”列为 COUNT(copy_id) AS available_copies FROM copies WHERE copy_id NOT IN (SELECT copy

所以,我正在尝试一个简单的图书借阅系统,但在创建和使用函数时遇到了问题

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

可用视图如下所示:

 book_id | available_copies
---------+------------------
 BI6     |                1
其中“可用拷贝数”列为

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
我真正想做的是。。如果像上面的“可用”视图中一样,“可用”副本为0,则BI7将不再位于“可用”视图中,因为所有已借阅postgres的副本都将提示您无法再借阅借阅的书籍,因为该书籍已无副本


我是plpgsql的新手。请帮忙

我不知道你们的Pg版本是什么,但可能是更老的版本。我在你的例子中看到了很多错误,所以我不相信它被博士后所接受

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;
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;
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;
如果贷款中不存在copyID记录,则返回TRUE

与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;
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;

相信我,它被博士后接受了,我也不敢相信,这就是我问的原因。哈哈哈。Im使用psql9.2。我对plpgsql没有任何背景知识,我有点仓促行事。你能想出什么办法来解决我的问题吗???@user2406280:你的信息是不可能的。问题中的脚本无法按原样执行。一定是误会了。哦,是这样吗??那么,如果不可能的话,有没有办法通过plpgsql函数检查这本书的可用性??很抱歉打扰您,我对plpgsql真的很陌生。@user2406280有很多方法可以通过plpgsql函数检查本书的可用性。他只是说,你提供的功能代码是无效的。是的,我知道。但是你能给我举个例子吗?如果我输入一个已经在贷款表中的副本id,这个功能会立即工作吗??它不需要任何东西就可以工作??它只依赖于带有字段拷贝id的表贷款。我试过了,但不起作用??可能是因为所有的复制ID都是连接列、复制codechar和复制noserial的结果,没有任何错误消息或解释它是如何工作的,我只能猜测。您使用的搜索引擎做了正确的事情。Postgers官方手册是您现在所需要的全部。其他的书、手册和邮件列表都是你不需要的。一定要显示你的PostgreSQL版本。查看VisualC++中的SuffEngRelQL.2.2.4,编译为VisualC++ + Bube 1600, 64位,没有可能编辑未被编辑的问题的代码,甚至编译失败。