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';

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.....

Obrigado

Anderson*
*




2009/2/6 Osvaldo Kussama <[email protected]>

> 2009/2/6 Anderson <[email protected]>:
> > boa tarde pessoal,
> >
> > estou fazendo esta procedure para ser disparada por um trigger, mas está
> > dando um erro na contrução da array, alguem poderia me ajudar a resolver
> > este problema....
> >
> > 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;
> > BEGIN
> >
> > SELECT into XCONTA,XANDCDREMESSA count(and_id),and_cd_remessa FROM
> > tb_andamentoremessa WHERE and_localizacao='P' GROUP BY
> and_id,and_cd_remessa
> > ORDER BY and_id ASC;
> >
> > FOR I IN 1..XCONTA LOOP
> >
> >       SELECT INTO
> >
> XCONTAIDREMESSA,XANDID,XANDCDREMESSA,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;
> >
> >              FOR I IN 1..XCONTAIDREMESSA LOOP
> >
> >                  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)
> >                                                     );
> >
> >                  DELETE FROM tb_andamentoremessa WHERE
> > and_cd_remessa=XANDCDREMESSA;
> >
> >              END LOOP;
> > END LOOP;
> >
> > RETURN XANDCDREMESSA;
> > END;
> > $body$
> > LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
> >
> >
> >
> > erro retornado
> > ERROR:  cannot subscript type integer because it is not an array
> > CONTEXT:  SQL statement "SELECT
> >
> 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_
> >
> >
>
>
> Não lhe parece estranho este SELECT:
>
> SELECT into XCONTA,XANDCDREMESSA count(and_id),and_cd_remessa
>   FROM tb_andamentoremessa
>  WHERE and_localizacao='P'
>  GROUP BY and_id,and_cd_remessa
>  ORDER BY and_id ASC;
>
> Count(and_id) mas com and_id na cláusula GROUP BY?
> Será sempre 1?
>
> Osvaldo
> PS. O erro é porque você está tratando como array um campo que não foi
> definido como array.
> _______________________________________________
> 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