我有这个错误:
---------------------------
pgAdmin III
---------------------------
An error has occurred:
ERROR: relation "vettura_tariffa" does not exist
LINE 2: from vettura_tariffa
^
QUERY: SELECT ( select valore
from vettura_tariffa
where new.targa=vettura.targa)
CONTEXT: PL/pgSQL function "progettoBD".costout() line 14 at assignment
---------------------------
OK
---------------------------
代码如下
create or replace function costout()
returns trigger AS
$$
DECLARE
giorno integer;
gg1 integer;
gg2 integer;
tariffa numeric(2,0) ;
costo integer;
BEGIN
gg1=extract (days from new.dataconsegna);
gg2=extract (days from new.dataritiro);
giorno=gg1-gg2;
tariffa=( select valore
from vettura join tariffa on vettura.tipotariffa=tariffa.tipo
where new.targa=vettura.targa);
costo=tariffa * giorni;
new.costoutilizzo=costo;
END;
$$ language plpgsql;
这个是触发器的代码
create trigger costo_utilizzo
after insert on utilizzo
for each row
execute procedure costout();
似乎它没有找到表格vettura,它与其他表格相同,如果我尝试简单地"选择*来自vettura"它工作正常。 我尝试用视图交换来自但问题仍然存在。 插入" utilizzo"后出现此错误。 抱歉我的英文不好,请提前谢谢。
答案 0 :(得分:1)
解决JAVA问题。
我们需要使用双引号和条形,以便postgresql接受该命令。
sql = "INSERT INTO \"SCHEMA\".\"TABLE\"() values(?,?,?)
答案 1 :(得分:0)
Ciao Atz34,
生成的错误表示您正在调用引用vettura_tariffa
的函数,而您发布的代码引用vettura JOIN tariffa
。可能是代码中某处的一个简单错误。但是,您的触发器和触发器功能还有一些问题。
首先,在修改BEFORE INSERT
的任何字段时,应调用NEW
触发器;在AFTER INSERT
触发器上,更改不会保存在表中(您只能执行审核或对其他表进行更改等副作用)。
其次,extract(date from ...)
在几个月之间出现问题。假设您的datacosegna
和dataritiro
列为date
列,您只需减去它们并添加1:NEW.dataritiro - NEW.dataconsegna + 1
(因此当天的回报不是免费的)。
第三,始终RETURN NEW
来自插入触发器。
然后,您可以将所有语句折叠为:
CREATE OR REPLACE FUNCTION costout() RETURNS trigger AS $$
BEGIN
SELECT valore * (NEW.dataritiro - NEW.dataconsegna + 1) INTO NEW.costoutilizzo
FROM vettura
JOIN tariffa ON vettura.tipotariffa = tariffa.tipo
WHERE NEW.targa = vettura.targa;
RETURN NEW;
END; $$ LANGUAGE plpgsql;