1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Dúvida em SQL

Discussão em 'Programação' iniciada por liquido, 1 de Novembro de 2007. (Respostas: 3; Visualizações: 1651)

  1. liquido

    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]
     
  2. slack_guy

    slack_guy Power Member

    deve ser
    Código:
    FOR r IN SELECT ....
     
  3. liquido

    liquido Power Member

    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: 2 de Novembro de 2007
  4. slack_guy

    slack_guy Power Member

    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: 2 de Novembro de 2007

Partilhar esta Página