Обсуждение: Procedure failing after upgrade
All,
I just upgraded to the latest version from 7.2.x and now a procedure is failing.
Please tell me what I'm doing wrong!
Original Func:
SELECT generateinvoice('{123,124}');
CREATE FUNCTION "generateinvoice" (integer[]) RETURNS integer AS '
DECLARE id_array ALIAS for $1; temppk INT4; count_it INT;
BEGIN count_it := 1;
SELECT INTO temppk nextval(''t_invoice_invoice_id_seq''); INSERT INTO t_invoice
(invoice_id,created_date, invoice_status_id, modified_date) VALUES (temppk, CURRENT_TIMESTAMP(2), ''1'',
CURRENT_TIMESTAMP(2));
WHILE id_array[count_it] LOOP
UPDATE t_event SET invoice_id=temppk, event_status_id=''5'' WHERE event_id=id_array[count_it];
count_it := count_it + 1; END LOOP;
-- TEST COUNT RETURN (count_it - 1); RETURN temppk; END;' LANGUAGE 'plpgsql';
My Latest Attempt:
SELECT generateinvoice('{123,124}');
CREATE FUNCTION "generateinvoice" (anyarray) RETURNS integer AS '
DECLAREid_array ALIAS for $1;temppk INT4;count_it INT;
BEGIN count_it := 1; SELECT INTO temppk nextval(''t_invoice_invoice_id_seq''); INSERT INTO t_invoice
(invoice_id,created_date, invoice_status_id, modified_date) VALUES (temppk, CURRENT_TIMESTAMP(2), ''1'',
CURRENT_TIMESTAMP(2));
WHILE id_array[count_it] LOOP
UPDATE t_project SET invoice_id=temppk, project_status_id=''5'' WHERE
project_id=id_array[count_it]; count_it := count_it + 1; END LOOP;
RETURN temppk;END;
' LANGUAGE 'plpgsql';
On Tue, 2004-05-04 at 09:32, patkins wrote:
> All,
>
> I just upgraded to the latest version from 7.2.x and now a procedure is failing.
>
> Please tell me what I'm doing wrong!
Please include the actual error message produced. That said, I'm getting
an interesting error. It appears as if the integer array type is being
confused for a boolean.
WHILE id_array[count_it] LOOP
It is expecting WHILE <boolean> LOOP. Make the id_array[count_it]
expression into a boolean rather than an integer. Something like:
WHILE id_array[count_it] IS NOT NULL LOOP
Are you using 7.4.x now?
If so, I think the problem is condition: WHILE id_array[count_it] LOOP
Change it to: WHILE id_array[count_it] NOTNULL LOOP
Jie Liang
-----Original Message-----
From: patkins [mailto:patkins@killinglyschools.org]
Sent: Tuesday, May 04, 2004 6:32 AM
To: pgsql-sql@postgresql.org
Subject: [SQL] Procedure failing after upgrade
All,
I just upgraded to the latest version from 7.2.x and now a procedure is
failing.
Please tell me what I'm doing wrong!
Original Func:
SELECT generateinvoice('{123,124}');
CREATE FUNCTION "generateinvoice" (integer[]) RETURNS integer AS '
DECLARE id_array ALIAS for $1; temppk INT4; count_it INT;
BEGIN count_it := 1;
SELECT INTO temppk
nextval(''t_invoice_invoice_id_seq''); INSERT INTO t_invoice (invoice_id, created_date,
invoice_status_id, modified_date) VALUES (temppk, CURRENT_TIMESTAMP(2),
''1'', CURRENT_TIMESTAMP(2));
WHILE id_array[count_it] LOOP
UPDATE t_event SET invoice_id=temppk,
event_status_id=''5'' WHERE event_id=id_array[count_it];
count_it := count_it + 1; END LOOP;
-- TEST COUNT RETURN (count_it - 1); RETURN temppk; END;' LANGUAGE 'plpgsql';
My Latest Attempt:
SELECT generateinvoice('{123,124}');
CREATE FUNCTION "generateinvoice" (anyarray) RETURNS integer AS '
DECLAREid_array ALIAS for $1;temppk INT4;count_it INT;
BEGIN count_it := 1; SELECT INTO temppk
nextval(''t_invoice_invoice_id_seq''); INSERT INTO t_invoice (invoice_id, created_date,
invoice_status_id, modified_date) VALUES (temppk, CURRENT_TIMESTAMP(2),
''1'', CURRENT_TIMESTAMP(2));
WHILE id_array[count_it] LOOP
UPDATE t_project SET invoice_id=temppk,
project_status_id=''5'' WHERE project_id=id_array[count_it]; count_it := count_it + 1; END LOOP;
RETURN temppk;END;
' LANGUAGE 'plpgsql';
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend
Rod Taylor <pg@rbt.ca> writes:
> an interesting error. It appears as if the integer array type is being
> confused for a boolean.
Up till 7.4, plpgsql's control statements didn't actually check whether
the given expression returned boolean :-(. They just assumed that the
resulting Datum should be interpreted as a bool. 7.4 will coerce to
bool or throw an error if it can't.
regards, tom lane