pessoal to quase resolvendo, só falta uma ultima coisa, inserir na
tb_andamentoconcluido, mas ta dando o seguinte erro *INSERT in not allowed
in a nom-volatile function.*

segue a procedure....


CREATE OR REPLACE FUNCTION "public"."sp_atualiza_andamento" (integer)
RETURNS integer AS
$body$
/* Corpo da nova função */
DECLARE
XIDUSU ALIAS FOR $1;
XCONTA integer;
XANDID integer[];
XCONTAANDREMESSA integer[];
XANDCDREMESSA integer;
XANDDTANDAMENTO varchar;
XANDCDUSUARIO integer;
XANDCDUNIDADE integer;
XANDCDROMANEIO integer;
XANDLOCALIZACAO varchar(2);
XARRAY integer;
XCONTAIDREMESSA integer[];
XANDCDREMESSAA integer[];
XCONTA2 integer;
XINSERT text;
XDELETE text;
BEGIN

XCONTAANDREMESSA := ARRAY(SELECT and_cd_remessa FROM tb_andamentoremessa
WHERE and_localizacao='P' ORDER BY and_cd_remessa ASC);

XCONTA := array_upper(XCONTAANDREMESSA,1);

    --LOOP PARA BUSCAR NA TABELA ANDAMENTOREMESSA OS REGISTROS PARA SEREM
INSERIDOS NA TABELA ANDAMENTO CONCLUIDO
    FOR I IN 1..XCONTA LOOP

        --SELECT BUSCANDO OS REGISTROS DE ACORDO COM OS NUMEROS DAS REMESSAS
QUE ESTÃO ARMAZENADOS NA ARRAY XANDCDREMESSA
         XCONTAIDREMESSA:= ARRAY(SELECT and_cd_remessa FROM
tb_andamentoremessa WHERE and_cd_remessa=XCONTAANDREMESSA[I] ORDER BY
and_cd_remessa ASC);

         XCONTA2 := array_upper(XCONTAIDREMESSA,1);
        --LOOP PARA INSERIR NA TABELA ANDAMENTO CONCLUIDO OS REGISTROS DA
TABELA ANDAMENTO REMESSA E UM DELETE NA TABELA ANDAMENTO REMESSA

                 FOR J IN 1..XCONTA2 LOOP

                 SELECT INTO
XANDCDREMESSA,XANDDTANDAMENTO,XANDCDUSUARIO,XANDCDUNIDADE,XANDCDROMANEIO,XANDLOCALIZACAO
and_cd_remessa,and_dt_andamento,

and_cd_usuario,usu_cd_unidade,and_cd_romaneio,and_localizacao FROM
tb_andamentoremessa WHERE and_cd_remessa=XCONTAANDREMESSA[I];

RAISE NOTICE 'Aqui a quantidade é %', XANDCDREMESSA;
RAISE NOTICE 'Aqui a quantidade é %', XANDDTANDAMENTO;
RAISE NOTICE 'Aqui a quantidade é %', XANDCDUSUARIO;
RAISE NOTICE 'Aqui a quantidade é %', XANDCDUNIDADE;
RAISE NOTICE 'Aqui a quantidade é %', XANDCDROMANEIO;
RAISE NOTICE 'Aqui a quantidade é %', XANDLOCALIZACAO;

                --INSERT NA TABELA ANDAMENTO CONCLUIDO
                XINSERT:= 'INSERT INTO
tb_andamentoconcluido(and_con_cd_remessa,
                                                    and_con_dt_andamento,
                                                    and_con_cd_usuario,
                                                    usu_con_cd_unidade,
                                                    and_con_cd_romaneio,

and_con_localizacao)VALUES('
                                                    ||XANDCDREMESSA||','
                                                    ||XANDDTANDAMENTO||','
                                                    ||XANDCDUSUARIO||','
                                                    ||XANDCDUNIDADE||','
                                                    ||XANDCDROMANEIO||','
                                                    ||XANDLOCALIZACAO||');';
                 EXECUTE XINSERT;

                 --DELETA OS REGISTROS DA TABELA ANDAMENTO REMESSA
               DELETE FROM tb_andamentoremessa WHERE
and_cd_remessa=XANDCDREMESSAA[I];

             END LOOP;
END LOOP;


RETURN 1;
END;
$body$
LANGUAGE 'plpgsql' STABLE CALLED ON NULL INPUT SECURITY INVOKER;




2009/2/9 Anderson <[email protected]>

> o que eu to tentando fazer é o seguinte:
>
> eu tenho uma tabela andamento remessa que armazena todo o andamento de uma
> remessa até a sua conclusão.
>
> então eu conto as remessas que ja estão concluidas "P"  e preciso fazer com
> que todos os andamentos dessa remessa sejam gravados na tabela andamento
> concluidos....
>
>
> ex. tenho 5 remessas a 1, 2 ,3 ,4 , 5 a remessa nº 5 tem 6 andamentos....
>
>
> tenho que inserir todos na tabela andamento concluido....
>
>
> ps: como eu faço pra na consulta o resultado ser inserido em  varias arrays
>
> ex:SELECT INTO XANDID[],XANDCDREMESSA2[],XANDDTANDAMENTO[]....
> and_id,and_cd_remessa,and_dt_andamento FROM tb_andamentoremessa....
>
> se não der pra entender ainda me avisa que eu tento explicar melhor....
>
> Obrigado
>
> Anderson
>
>
>
>
>
>
>
>
>
>
>
>
> 2009/2/9 Osvaldo Kussama <[email protected]>
>
> 2009/2/9 Anderson <[email protected]>:
>> > pessoal fiz como vcs falaram, mas agora está dando outro erro, tentei
>> achar
>> > no manual mas não obtive resultados....minha esperiencia em procedure é
>> bem
>> > limitada, só fiz procedures mais basicas e essa ta me deixando de
>> cabelos
>> > brancos....hehehehe.
>> >
>> >
>> > CREATE OR REPLACE FUNCTION "public"."sp_atualiza_andamento" (integer)
>> > RETURNS integer AS
>> > $body$
>> > /* Corpo da nova função */
>> > DECLARE
>> > XIDUSU ALIAS FOR $1;
>> > XCONTA integer;
>> > XANDID integer;
>> > XANDCDREMESSA integer[];
>> > XANDDTANDAMENTO varchar;
>> > XANDCDUSUARIO integer;
>> > XANDCDUNIDADE integer;
>> > XANDCDROMANEIO integer;
>> > XANDLOCALIZAÇÃO varchar;
>> > XARRAY integer;
>> > XCONTAIDREMESSA integer;
>> > XANDCDREMESSAA integer[];
>> > XCONTA2 integer;
>> > BEGIN
>> >
>> > --BUSCA QUANTO REGISTROS TEREI NO BANCO.
>> > SELECT INTO XCONTA count(and_id) FROM tb_andamentoremessa WHERE
>> > and_localizacao='P';
>> > XCONTA2 :=XCONTA;
>> > --LOOP PARA ARMAZENAR NA ARRAY XANDREMESSA O NUMERO DAS REMESSAS DE
>> ACORDO
>> > COM A QUANTIDADE DE REGISTROS
>> > FOR I IN 1..XCONTA LOOP
>> >
>> >    SELECT INTO XANDCDREMESSA and_cd_remessa FROM tb_andamentoremessa
>> WHERE
>> > and_localizacao='P';
>>
>> Não consegui entender o que você está tentando fazer aqui.
>>
>>
>> >
>> > END LOOP;
>> >
>> >     --LOOP PARA BUSCAR NA TABELA ANDAMENTOREMESSA OS REGISTROS PARA
>> SEREM
>> > INSERIDOS NA TABELA ANDAMENTO CONCLUIDO
>> >     FOR I IN 1..XCONTA2 LOOP
>> >         --SELECT BUSCANDO OS REGISTROS DE ACORDO COM OS NUMEROS DAS
>> REMESSAS
>> > QUE ESTÃO ARMAZENADOS NA ARRAY XANDCDREMESSA
>> >         SELECT INTO
>> >
>> XCONTAIDREMESSA,XANDID,XANDCDREMESSAA,XANDDTANDAMENTO,XANDCDUSUARIO,XANDCDUNIDADE,XANDCDROMANEIO,XANDLOCALIZAÇÃO
>> >
>> count(and_cd_remessa),and_id,and_cd_remessa,and_dt_andamento,and_cd_usuario,usu_cd_unidade,and_cd_romaneio,and_localizacao
>> > FROM tb_andamentoremessa WHERE and_cd_remessa=XANDCDREMESSA[I] GROUP BY
>> >
>> and_id,and_cd_remessa,and_dt_andamento,and_cd_usuario,usu_cd_unidade,and_cd_romaneio,and_localizacao
>> > ORDER BY and_id ASC;
>> >
>> >         XARRAY := array_upper(XANDCDREMESSAA,1);
>> >
>> >                --LOOP PARA INSERIR NA TABELA ANDAMENTO CONCLUIDO OS
>> > REGISTROS DA TABELA ANDAMENTO REMESSA E UM DELETE NA TABELA ANDAMENTO
>> > REMESSA
>> >
>> >              FOR I IN 1..XARRAY LOOP
>> >                  --INSERT NA TABELA ANDAMENTO CONCLUIDO
>> >                  INSERT INTO tb_andamentoconcluido (and_id,
>> >                                                     and_cd_remessa,
>> >                                                     and_dt_andamento,
>> >                                                     and_cd_usuario,
>> >                                                     usu_cd_unidade,
>> >                                                     and_cd_romaneio,
>> >                                                     and_localizacao
>> >                                                     )VALUES(
>> >                                                     XANDID,
>> >                                                     XANDCDREMESSA,
>> >
>> > quote_literal(XANDDTANDAMENTO),
>> >                                                     XANDCDUSUARIO,
>> >                                                     XANDCDUNIDADE,
>> >                                                     XANDCDROMANEIO,
>> >
>> > quote_literal(XANDLOCALIZAÇÃO)
>> >                                                     );
>> >                  --DELETA OS REGISTROS DA TABELA ANDAMENTO REMESSA
>> >                  DELETE FROM tb_andamentoremessa WHERE
>> > and_cd_remessa=XANDCDREMESSAA[I];
>> >
>> >              END LOOP;
>> > END LOOP;
>> >
>> >
>> > RETURN XCONTA;
>> > END;
>> > $body$
>> > LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
>> >
>> >
>> > O erro que esta retornando é este:
>> >
>> > ERROR:  array value must start with "{" or dimension information
>> > CONTEXT:  PL/pgSQL function "sp_atualiza_andamento" line 24 at SQL
>> statement
>> >
>> >
>> > se alguem puder me ajudar eu fico muito agradecido....
>> > caso seja muito complicado, se vcs me diserem o que devo procurar no
>> manual
>> > eu me viro aqui... tipo procura por ARRAY ou por array_upper.....
>> >
>>
>>
>>
>> Tente substituir este trecho:
>> --BUSCA QUANTO REGISTROS TEREI NO BANCO.
>> SELECT INTO XCONTA count(and_id) FROM tb_andamentoremessa WHERE
>> and_localizacao='P';
>> XCONTA2 :=XCONTA;
>> --LOOP PARA ARMAZENAR NA ARRAY XANDREMESSA O NUMERO DAS REMESSAS DE
>> ACORDO COM A QUANTIDADE DE REGISTROS
>>
>> FOR I IN 1..XCONTA LOOP
>>
>>   SELECT INTO XANDCDREMESSA and_cd_remessa FROM tb_andamentoremessa
>> WHERE and_localizacao='P';
>>
>> END LOOP;
>>
>> por:
>>
>> XANDCDREMESSA := ARRAY(SELECT and_cd_remessa FROM tb_andamentoremessa
>> WHERE and_localizacao='P');
>> XCONTA := array_upper(XANDCDREMESSA);
>>
>> Osvaldo
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a