Обсуждение: Procedure failing after upgrade

Поиск
Список
Период
Сортировка

Procedure failing after upgrade

От
"patkins"
Дата:
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';






Re: Procedure failing after upgrade

От
Rod Taylor
Дата:
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




Re: Procedure failing after upgrade

От
"Jie Liang"
Дата:
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


Re: Procedure failing after upgrade

От
Tom Lane
Дата:
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