Another plpgsql question..
CREATE FUNCTION invoice_payment() RETURNS OPAQUE AS '
BEGIN
UPDATE invoice_master SET total = total - NEW.amount,updated = now(),
is_paid=(CASE WHEN (total - NEW.amount) = 0.00 THEN ''t'' ELSE ''f'' END)
WHERE invoice_id = NEW.invoice_id;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
Ok, thanks for the heads up on now().. That works but I add the last part of
the query in there and everything but the last part works.. Can I not do
CASE WHEN statements in functions like that? That query works when I run it
straight from psql but so did the other, so I'm wondering if the same kind
of problem is happening here too..
Thanks!
-Mitch
"Mitch Vincent" <mitch@venux.net> writes:
CREATE FUNCTION invoice_payment() RETURNS OPAQUE AS '
BEGIN
UPDATE invoice_master SET total = total - NEW.amount,updated = now(),
is_paid=(CASE WHEN (total - NEW.amount) = 0.00 THEN ''t'' ELSE ''f'' END)
WHERE invoice_id = NEW.invoice_id;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
Ok, thanks for the heads up on now().. That works but I add the last part of
the query in there and everything but the last part works.. Can I not do
CASE WHEN statements in functions like that? That query works when I run it
straight from psql but so did the other, so I'm wondering if the same kind
of problem is happening here too..
It looks fine to me. Please define "everything but the last part works"
more precisely.
regards, tom lane
is_paid is never updated...
-Mitch
----- Original Message -----
From: "Tom Lane" <tgl@sss.pgh.pa.us>
To: "Mitch Vincent" <mitch@venux.net>
Cc: <pgsql-general@postgresql.org>
Sent: Tuesday, January 23, 2001 10:56 AM
Subject: Re: [GENERAL] Another plpgsql question..
"Mitch Vincent" <mitch@venux.net> writes:
CREATE FUNCTION invoice_payment() RETURNS OPAQUE AS '
BEGINUPDATE invoice_master SET total = total - NEW.amount,updated = now(),
is_paid=(CASE WHEN (total - NEW.amount) = 0.00 THEN ''t'' ELSE ''f''
END)
WHERE invoice_id = NEW.invoice_id;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';Ok, thanks for the heads up on now().. That works but I add the last
part of
the query in there and everything but the last part works.. Can I not do
CASE WHEN statements in functions like that? That query works when I run
it
straight from psql but so did the other, so I'm wondering if the same
kind
Show quoted text
of problem is happening here too..
It looks fine to me. Please define "everything but the last part works"
more precisely.regards, tom lane
"Mitch Vincent" <mitch@venux.net> writes:
is_paid is never updated...
It's not possible that is_paid is never updated; that command *will*
replace the total, updated, and is_paid columns with *something*.
It may be that in the cases you've checked, it gets updated to the
same value it had before. That's why I want to see the test cases.
regards, tom lane
Ok, it appears now I have an error.. Unless I'm going crazy, this started
after I had to do a restore because of one of those cache lookup errors.. I
changed nothing, still, this is what I get..
CREATE FUNCTION invoice_payment() RETURNS OPAQUE AS '
BEGIN
UPDATE invoice_master SET total = total - NEW.amount,updated = now(),
is_paid=(CASE WHEN (total - NEW.amount) = 0.00 THEN ''t'' ELSE ''f'' END)
WHERE invoice_id = NEW.invoice_id;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
Now I get
brw=# INSERT into invoice_payments VALUES
(1,1000,'now',100,'now',100,1,1,150.00);
ERROR: Unable to identify an operator '=' for types 'numeric' and 'float8'
You will have to retype this query using an explicit cast
DEBUG: Last error occured while executing PL/pgSQL function invoice_payment
DEBUG: line 2 at SQL statement
ERROR: Unable to identify an operator '=' for types 'numeric' and 'float8'
You will have to retype this query using an explicit cast
brw=#
--- amount and total are both numeric(9,2), I've tried casting everything
(total,amount and 0.00) to float and everything to numeric with the same
error popping up.. What needs casting here?
I can determine if an invoice has been paid or not a number of ways, really
what I should do there is NEW.amount >= total -- I tried and got the above
error again..
Thanks!
-Mitch
----- Original Message -----
From: "Tom Lane" <tgl@sss.pgh.pa.us>
To: "Mitch Vincent" <mitch@venux.net>
Cc: <pgsql-general@postgresql.org>
Sent: Tuesday, January 23, 2001 11:05 AM
Subject: Re: [GENERAL] Another plpgsql question..
Show quoted text
"Mitch Vincent" <mitch@venux.net> writes:
is_paid is never updated...
It's not possible that is_paid is never updated; that command *will*
replace the total, updated, and is_paid columns with *something*.
It may be that in the cases you've checked, it gets updated to the
same value it had before. That's why I want to see the test cases.regards, tom lane
"Mitch Vincent" <mitch@venux.net> writes:
ERROR: Unable to identify an operator '=' for types 'numeric' and 'float8'
You will have to retype this query using an explicit cast
--- amount and total are both numeric(9,2),
Hm, then "(total - NEW.amount) = 0.00::numeric" should work, although
I don't see why you don't just write it as "total = NEW.amount".
regards, tom lane