Dúvida em SQL

liquido

Power Member
Estou com dificuldade em utilizar ciclos FOR em PL\SQL (no Postgres)..queria fazer um ciclo por exemplo a utilizar os valores de uma coluna específica de uma tabela mas obtenho os seguintes erros:

[FONT=courier new,monospace]as[/FONT]
[FONT=courier new,monospace] $$[/FONT]

[FONT=courier new,monospace] declare n numeric(20,2) default 0;[/FONT]

[FONT=courier new,monospace] begin[/FONT]
[FONT=courier new,monospace] for r as[/FONT]
[FONT=courier new,monospace] select balance from account[/FONT]
[FONT=courier new,monospace] where branch_name = 'Perryridge'[/FONT]
[FONT=courier new,monospace] do[/FONT]
[FONT=courier new,monospace] set n = n + r.balance[/FONT]
[FONT=courier new,monospace] end for;[/FONT]

[FONT=courier new,monospace] return n;[/FONT]
[FONT=courier new,monospace] end [/FONT]


[FONT=courier new,monospace] $$[/FONT]

[FONT=courier new,monospace] language plpgsql;[/FONT]

e recebo:

[FONT=courier new,monospace]psql:c:/lab6.sql:80: ERROR: syntax error at or near "as"[/FONT]
[FONT=courier new,monospace] LINE 12: for r as[/FONT]
[FONT=courier new,monospace] ^[/FONT]

tentei fazer um ciclo sobre os nomes das agencias:

[FONT=courier new,monospace] for branch_name in select * from branch loop[/FONT]
[FONT=courier new,monospace](..)[/FONT]
[FONT=courier new,monospace]end loop;[/FONT]

[FONT=courier new,monospace]psql:c:/lab6.sql:78: ERROR: loop variable of loop over rows must be a record or row variable or list of scalar variables at or near "loop" [/FONT]
[FONT=courier new,monospace]LINE 13: for branch in select * from branch loop

será que alguém me pode dar alguma dica?

obrigado!

[/FONT]
 
não consegui =\

por exemplo se tiver uma tabela account que tem uma coluna chamada "balance" e quizer fazer o somatório de todos os "balance" pensei que seria:

Código:
create function b()
 returns numeric(20,2)
 
 as
 $$
 
    declare 
    n numeric(20,2);
    n = 0;
    begin
        for r in ( select * from account )
         loop
          n = n + r.balance;
         end loop;
        
        
        return n;
    end        
        

 $$
 
language plpgsql;
mas:

Código:
# select * from b();
ERROR:  missing FROM-clause entry for table "r"
LINE 1: SELECT   $1  + r.balance
                       ^
QUERY:  SELECT   $1  + r.balance
CONTEXT:  PL/pgSQL function "b" line 9 at assignment

terei de usar cursores para isso?

eu com cursores faço:

Código:
create or replace function b()
 returns numeric(20,2) as $$
 
 declare
  soma numeric(20,2) := 0;
  temp numeric(20,2) := 0;
  c1 cursor for select balance from account;
 
 begin
    open c1;
    loop
        fetch c1 into temp;
        if not found then exit;
        end if;
        
        soma = soma + temp;
        
    end loop;
    
    close c1;
    
    return soma;
 end

 $$ language plpgsql;

mas continuo a achar que deve dar para fazer com um for e não percebo como...alguém me pode ajudar?

obrigado
 
Última edição:
E assim?
Código:
CREATE OR REPLACE FUNCTION b() RETURNS numeric(20,2) AS $$

DECLARE
    r RECORD;
    n numeric(20,2);
    n = 0;

BEGIN
    FOR r IN SELECT * FROM account LOOP
        n = n + r.balance;
    END LOOP;
        
    RETURN n;
END;

$$ LANGUAGE plpgsql;
 
Última edição:
Back
Topo