"关系不存在" PostgreSQL的

时间:2015-07-11 13:34:15

标签: 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 个答案:

答案 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 ...)在几个月之间出现问题。假设您的datacosegnadataritiro列为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;