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