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位,没有可能编辑未被编辑的问题的代码,甚至编译失败。