Re: Loop through records - Mailing list pgsql-novice

From Emiliano Amilcarelli
Subject Re: Loop through records
Date
Msg-id 4375D97A.6080207@tin.it
Whole thread Raw
In response to Re: Loop through records  (Andreas Kretschmer <akretschmer@spamfence.net>)
Responses Re: Loop through records  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-novice
I managed to get results printed out from the function, but now i cannot
If..THEN working inside the same function.
To better show what strange behaviour i'm getting i explain my problem
from the beginning

Two simple queries correctly showing results:

First :  SELECT * from "ERRORI_REMOTI_PER_GIORNO_E_ORA" where
"PROVE_FALLITE" >= 30;

IMISDNMilanoRozzano | ERRORE REMOTO | 30/10/05 02      |            42
  ........(snip)....
(5 righe)

Second :   SELECT * from "ERRORI_REMOTI_PER_GIORNO_E_ORA" where
"PROVE_FALLITE" >= 90;

(0 righe)

The following function works fine, displaying fine results:

CREATE OR REPLACE FUNCTION "public"."allarma_accesso" (soglia integer)
RETURNS text AS
$body$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT * from "ERRORI_REMOTI_PER_GIORNO_E_ORA" where
"PROVE_FALLITE" >=soglia::INT
    LOOP
    RAISE NOTICE '--> Ag % Err % Data % N° Err %', rec."AGENT",
rec."ERRORE",rec."DATA_ORA_ACCESSO",rec."PROVE_FALLITE";
    END LOOP;
    RETURN 'Operazione Completata';

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

select allarma_accesso('30');
NOTICE:  --> Ag IMISDNMilanoRozzano Err ERRORE REMOTO Data 30/10/05 02
N° Err 42
NOTICE:  --> Ag IMRTGTorinoArdigo Err ERRORE REMOTO Data 30/10/05 02 N°
Err 36
NOTICE:  --> Ag IMRTGFirenzeBruni Err ERRORE REMOTO Data 30/10/05 02 N°
Err 34
NOTICE:  --> Ag IMRTGMilanoRozzano Err ERRORE REMOTO Data 30/10/05 02 N°
Err 34
NOTICE:  --> Ag IMRTGRomaOriolo Err ERRORE LOCALE Data 30/10/05 02 N° Err 31
    allarma_accesso
-----------------------
 Operazione Completata
(1 riga)

 select allarma_accesso('90');
    allarma_accesso
-----------------------
 Operazione Completata
(1 riga)

If I try to use IF..THEN inside the function I get strange ( to me)
results:
CREATE OR REPLACE FUNCTION "public"."allarma_accesso" (soglia integer)
RETURNS text AS
$body$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT * from "ERRORI_REMOTI_PER_GIORNO_E_ORA" where
"PROVE_FALLITE" >=soglia::INT
    LOOP
    IF FOUND THEN
    RAISE NOTICE '--> Ag % Err % Data % N° Err %', rec."AGENT",
rec."ERRORE",rec."DATA_ORA_ACCESSO",rec."PROVE_FALLITE";
    ELSE
    RAISE NOTICE 'No Records found';
    END IF;
    END LOOP;
    RETURN 'Operazione Completata';

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

*
  *select allarma_accesso('30');
NOTICE:  No Records found
NOTICE:  No Records found
NOTICE:  No Records found
NOTICE:  No Records found
NOTICE:  No Records found
    allarma_accesso
-----------------------
 Operazione Completata
(1 riga)

 select allarma_accesso('90');
    allarma_accesso
-----------------------
 Operazione Completata
(1 riga)


Where is the wrong thing i'm doing?

Thks....
Emil



Andreas Kretschmer ha scritto:
> Emiliano Amilcarelli <amiemi@tin.it> schrieb:
>
>
>> tatus: O
>> Content-Length: 1264
>> Lines: 47
>>
>> Hi all,
>> I'm a PostgreSQL novice (obviously)...
>> I' trying to write some test functions to iterate over recordsets...
>>
>> this is one:
>>
>> CREATE OR REPLACE FUNCTION "public"."new_allarma" (soglia name) RETURNS
>> text AS
>> $body$
>> DECLARE
>>     rec RECORD;
>>     agent text;
>> BEGIN
>>
>>      FOR rec in SELECT * from "ERRORS" where "MAX_ERRORS" > = soglia limit
>> 3
>>     LOOP
>>         RAISE NOTICE '--> RECORD  --> ';
>>     END LOOP;
>>     RAISE NOTICE 'Complete';
>>     RETURN 'OK';
>> END;
>> $body$
>> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
>>
>> It doesn't even print the string --> RECORD  --> as I supposed it to do...
>>
>> but raises the error:ERROR:  record "rec" is not assigned yet
>> DETAIL:  The tuple structure of a not-yet-assigned record is indeterminate.
>> CONTEXT:  PL/pgSQL function "new_allarma2" line 6 at for over select rows
>>
>
> My guess:
> The problem is, you should create a string with your sql-query and
> execute this string, because you have parameters in your query.
>
> I will give you a example:
>
> create or replace function foo_test(int) returns text as $$
> declare rec record;
> begin
>     for rec in execute 'select * from foo where id = ' || $1 || ';' loop
>         raise notice '--> RECORD  --> ';
>     end loop;
>     return 'ready';
> end;
> $$ language plpgsql;
>
>
> test=> select foo_test(1);
> HINWEIS:  --> RECORD  -->
>  foo_test
> ----------
>  ready
> (1 Zeile)
>
>
>
>
> HTH, Andreas
>


pgsql-novice by date:

Previous
From: Andreas Kretschmer
Date:
Subject: Re: Loop through records
Next
From: Tom Lane
Date:
Subject: Re: Loop through records