2009/4/23 Anderson <[email protected]>:
> não é bem isso......fiz a procedure mas ta dando erro, não manjo muito de
> procedures, tentei achar no manual mas não entendi como utilizar as funç
> ões, tentei achar na lista mas daqui do meu trampo não consegui acessar....
> então recorro aos amigos para me ajudarem....
>
> procedure:
>
> CREATE OR REPLACE FUNCTION "public"."sp_gera_gestao" (integer, integer,
> integer, integer, varchar) RETURNS integer AS
> $body$
> /* Corpo da nova função */
> DECLARE
> XQUANTGESTAO ALIAS FOR $1;
> XIDSETOR ALIAS FOR $2;
> XIDUSUARIO ALIAS FOR $3;
> XANO ALIAS FOR $4;
> XSUFIXO ALIAS FOR $5;
> --VARIAVEL QUE VAI RECEBER O NUMERO DE REGISTROS
>
> XRECEBENUMEROGESTAO integer[];
>
> -- VARIAVEIS PARA A CRIAÇÃO DAS TABELAS QUE SOFRERÃO ALTERAÇÕES//
> XTBNOME text;
> XTBID text;
> XTBANO text;
> XTBUSUARIO text;
> XTBSETOR text;
>
> --VARIAEIS PARA EXECUÇÃO
> XINSERT text;
>
> CONTA integer;
>
> BEGIN
> --MONTA O NOME DAS TABELAS DE ACORDO COM O SUFIXO DA UNIDADE
> XTBNOME := 'tb_remessagestao'||XSUFIXO;
> XTBID := 'ges'||XSUFIXO||'_id_remessa';
> XTBANO := 'ges'||XSUFIXO||'_ano';
> XTBUSUARIO := 'ges'||XSUFIXO||'_id_usuario';
> XTBSETOR := 'ges'||XSUFIXO||'_id_setor';
>
> CONTA := 0;
>
> WHILE (CONTA < XQUANTGESTAO) LOOP
> --INSERE NO BANCO O ID DO USUARIO, SETOR E ANO
>   XINSERT := 'INSERT INTO '||XTBNOME||'('||
>                             XTBANO||','||
>                             XTBUSUARIO||','||
>                             XTBSETOR||'
>                             )VALUES('||
>                             XANO||','||
>                             XIDUSUARIO||','||
>                             XIDSETOR||')';
> EXECUTE XINSERT;
> --FAZ CONSULTA NA TABELA QUE ACABOU DE RECEBER O REGISTRO E ARMAZENA EM UMA
> ARRAY
> XRECEBENUMEROGESTAO := 'SELECT max('||XTBID||') FROM '||XTBNOME;
>
> RAISE NOTICE 'VALOR %',XRECEBENUMEROGESTAO;
> CONTA := CONTA+1;
> END LOOP;
> RETURN 1;
> END;
> $body$
> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
>
>
> ERRO QUE RETORNA AO EXECUTAR A PROCEDURE.
>
> ERROR:  array value must start with "{" or dimension information
> CONTEXT:  PL/pgSQL function "sp_gera_gestao" line 45 at assignment
>
>
> se alguem puder me ajudar a resolver isso, ou dizer qual a função que eu
> deve pesquisar eu fico agradecido.
>


Você está fazendo algumas coisas erradas.

Não sei qual a versão do PostgreSQL você está utilizando mas nas mais
recentes você pode utilizar [1]:
CREATE OR REPLACE FUNCTION public.sp_gera_gestao(XQUANTGESTAO integer,
XIDSETOR integer, XIDUSUARIO integer, XANO integer, XSUFIXO varchar)
RETURNS integer AS
no lugar de todos aqueles aliases.

Você não pode tratar um array como se fosse uma variável comum em um
comando de atribuição. Se você deseja colocar um valor numa
determinada posição do array você precisa dizer qual é esta posição
(ou índice).
Outra coisa: os arrays não são dinâmicos no sentido de que basta
colocar um novo índice para modificar o tamanho do array. Para isso
você precisa ou criar o array já inicializado com o número de
elementos que deseja ou utilizar operações sobre arrays,
particularmente o operador array-to-element concatenation ou a função
array_append.

Em
XRECEBENUMEROGESTAO := 'SELECT max('||XTBID||') FROM '||XTBNOME;
me parece que você quer fazer duas coisas: executar um comando
dinâmico e colocar um valor no array.
Quanto ao array já falei acima, quanto a comando dinâmico você
precisa, obrigatoriamente, usar um EXECUTE (como você fez no INSERT).
Não fica claro o que é  XTBID mas se for um campo da tabela ao qual
foi atribuido um valor quando do INSERT e você deseja este valor então
use:
  XINSERT := 'INSERT INTO '||XTBNOME||'('||
                            XTBANO||','||
                            XTBUSUARIO||','||
                            XTBSETOR||'
                            ) VALUES('||
                            XANO||','||
                            XIDUSUARIO||','||
                            XIDSETOR||') RETURNING XTBID INTO
XRECEBENUMEROGESTAO[' || CONTA || '];';
EXECUTE XINSERT;
ou algo do tipo.

[1] http://www.postgresql.org/docs/current/interactive/plpgsql-declarations.html
[2] http://www.postgresql.org/docs/current/interactive/functions-array.html
[3] 
http://www.postgresql.org/docs/current/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW

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

Responder a