2015-07-11 206 views
-1

我有这样的错误:“关系不存在” PostgreSQL的

--------------------------- 
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”上插入后出现此错误。 对不起,我的英语不好,提前谢谢。

+2

我看到两个'vettura'和'vettura_tariffa'? – fvu

+0

'search_path'问题? –

+0

该查询没有生成该错误。在查询中,您调用'vettura',但错误是由'vettura_tariffa'造成的。要么你看错了查询,要么你有另一个触发器 –

回答

0

侨Atz34,

所产生的错误指示要调用的功能,使得以vettura_tariffa参考,而您发布的代码是指vettura JOIN tariffa。可能是代码中的某个简单错误。但是,您的触发器和触发器功能还存在一些问题。

首先,当您修改NEW的任何字段时,您应该调用BEFORE INSERT触发器;在AFTER INSERT触发器中,更改不会保存在表中(您只能执行审计或对其他表进行更改等副作用)。

其次,extract(date from ...)给几个月之间的问题。假设你的datacosegnadataritirodate列,你可以简单地减去它们并加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; 
+0

嗨!谢谢,但即使你的建议它不起作用,并粘贴代码我忘了che“返回新” –

+1

“它不工作”是没有足够的信息来帮助你。什么是错误? (查看postgresql日志文件以获取更多详细信息。)编辑您的问题以显示表定义。 – Patrick

1

解决方案JAVA问题。

我们需要使用双引号和小节,以便命令被postgresql接受。

sql = "INSERT INTO \"SCHEMA\".\"TABLE\"() values(?,?,?)

相关问题