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