2009/2/10 Anderson <[email protected]>:
> 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;
>



Do manual:
"STABLE indicates that the function cannot modify the database,..."
http://www.postgresql.org/docs/current/interactive/sql-createfunction.html

Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a