Hi,
I'm new to postgresql and learning writing the trigger.
Included below was one of the execise I did. It kept
producing an error message that suggested the operater '-'
was undefined for int8/int4. Since both int8 and int4
are the basic types, I believed I might miss something.
Appology for the long post and thanks for any advise,
Min
DROP trigger t_diff on tb_cnt32; DROP function f_diff(); DROP TABLE tb_cnt32; create table tb_cnt32 (t int8, s int8,
vint8); insert into tb_cnt32 values (0, 0, 0); -- -- diff function -- create function f_diff() returns opaque as '
declare prev record; begin select into prev * from tb_cnt32 where t=(select max(t) from tb_cnt32); -- can not do
-- select into prev * from tb_cnt32 where t=max(t); -- ^^^^^ if not found
then raise exception ''Empty table tb_cnt32???''; end if; prev.v=new.v-prev.v; update tb_cnt32 set v=prev.v
wheret=prev.t;
return new; end; ' language 'plpgsql';
-- -- t_diff trigger -- create trigger t_diff before insert on tb_cnt32 for each row execute procedure
f_diff(); insert into tb_cnt32 values (1000, 5, 10); ERROR: There is no operator '-$' for types 'int8' and 'int4'
Youwill either have to retype this query using an explicit cast, or you will have to define the operator using
CREATEOPERATOR
Following the hint of the error message, I trid casting prev.v::int8,
new.v::int4 and prev.v::int4. But the results were the same.
I'm using v6.5 on Linux 2.0.35 with gcc version egcs-2.91.66.
psql \df listed:
...
int8 |int8div |int8 int8 |divide
int8 |int8larger |int8 int8 |larger of two
int8 |int8mi |int8 int8 |subtraction
int8 |int8mul |int8 int8 |multiply
int8 |int8pl |int8 int8 |addition
int8 |int8smaller |int8 int8 |smaller of two
int8 |int8um |int8 |unary minus
...