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