Exemplo...
CREATE OR REPLACE FUNCTION fnc.codigotabela(pnTipoCodigo INTEGER,
pcNomeCampo
VARCHAR,
pcTabela
VARCHAR,
pcValorCodigo VARCHAR)
RETURNS VARCHAR AS
$$
DECLARE
rResultado RECORD;
BEGIN
BEGIN
IF pnTipoCodigo = 1 THEN
IF COALESCE(pcValorCodigo,'0') = '0' THEN
FOR rResultado IN
EXECUTE 'SELECT MAX('||pcNomeCampo||'::INTEGER) AS
codigo FROM '||pcTabela||' WHERE uk =
fnc.regranegocio('||QUOTE_LITERAL(pcTabela)||','||pcTabela||'.fkempresa,'||pcTabela||'.fkfilial,'||pcTabela||'.fkunidade);'
LOOP
END LOOP;
RETURN COALESCE(rResultado.codigo,0)+1;
END IF;
RETURN pcValorCodigo;
ELSIF pnTipoCodigo = 2 THEN
FOR i IN 1..LENGTH(pcValorCodigo) LOOP
IF POSITION(SUBSTRING(pcValorCodigo,i,1) IN
'1234567890') = 0 THEN
RAISE EXCEPTION 'Código inválido!';
END IF;
END LOOP;
RETURN pcValorCodigo;
ELSE
RETURN pcValorCodigo;
END IF;
EXCEPTION WHEN others THEN RAISE EXCEPTION 'Código inválido!';
END;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
Daniel Falcão escreveu:
Hum... é verdade, o problema está no INTO. Estava
consultando a documentação agora pouco, mas não estou encontrando bons
exemplos para contornar isso. Alguém aí pode me dar uma ajuda com esse
"FOR IN EXECUTE" no contexto do problema dessa minha procedure?
Grato,
Daniel
2009/11/18 Wolak <[email protected]>
O comando EXECUTE não
trabalha com INTO... no seu caso a variavel
SUBTOTAL... voce precisa executar o FOR IN EXECUTE...
Tenho exemplos se precisar.
Wolak.
Email/MSN: [email protected]
Daniel Falcão escreveu:
Senhores,
Tenho a seguinte PROCEDURE:
CREATE OR REPLACE FUNCTION
correg.somatorio_correicao(cod_resolucao integer, cod_membro integer,
cod_orgexecucao integer, data_inicial date, data_final date, cod_campos
integer[])
RETURNS integer AS
$BODY$
DECLARE
subtotal integer;
total integer;
tam_array integer;
membro varchar;
orgexecucao varchar;
BEGIN
/*descobre o tamanho do array passado por parametro:*/
tam_array := array_upper(cod_campos, 1);
/*inicializa o contador*/
total := 0;
/*ajustando parametros na query*/
membro := '';
orgexecucao := '';
if cod_membro = 0
then
membro := ' r.fk_tmpmembro = ' || cod_membro || ' and ';
end if;
if cod_orgexecucao = 0
then
orgexecucao := ' r.fk_tmporgaoexecucao = ' || cod_orgexecucao ||
' and ';
end if;
/*varredura no array:*/
for i in 1..tam_array loop
execute '
select
(select
sum(v.quantidade)
from correg.valor v
join correg.raf r on
r.id
= v.fk_raf
join rh.orgaoexecucao oe on
oe.fk_orgao = r.fk_tmporgaoexecucao
join rh.orgaoadministracao oa on
oa.id
= oe.fk_orgaoadministracao
join rh.comarca cx on
cx.id
= oa.fk_comarca
where
v.fk_campo = c.id and
(r.data between ' || data_inicial || ' and ' ||
data_final || ') and
' || membro || '
' || orgexecucao || '
r.excluido is false
) as quantidade
into subtotal
from correg.campo c
where
c.excluido is false and
c.fk_modelo = ' || cod_resolucao || '
and c.id
= ' || cod_campos[i] || ';';
/*vai construindo o valor total*/
total := total + subtotal;
end loop;
/*retorna a soma dos codigos:*/
return total;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION correg.somatorio_correicao(integer, integer, integer,
date, date, integer[]) OWNER TO postgres;
O banco de dados aceita o codigo acima sem acusar nenhum tipo de
problema, mas quando tento executar a query abaixo no pgadmin:
select correg.somatorio_correicao(2, 0, 0, date
'2009-10-01', date '2009-11-01', array[1097,1098,1099,1100,1101,1102]);
O console de mensagens me retorna o seguinte erro:
ERROR: EXECUTE of SELECT ... INTO is not
implemented yet
CONTEXT: PL/pgSQL function "somatorio_correicao" line 30 at execute
statement
********** Erro **********
ERROR: EXECUTE of SELECT ... INTO is not implemented yet
SQL state: 0A000
Contexto: PL/pgSQL function "somatorio_correicao" line 30 at execute
statement
A linha 30 está localizada antes do comentário: /*varredura no
array:*/
A versão do banco que utilizo é a 8.1, creio que o comando EXECUTE não
seja compatível com esta versão, alguém conhece alguma alternativa para
o código acima?
Grato,
Daniel
--
Atenciosamente,
Daniel Falcão
Analista e Desenvolvedor de Software
http://lattes.cnpq.br/2208735579737258
http://embuar.blogspot.com
http://twitter.com/embuar
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4618 (20091118) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
__________ Information from ESET NOD32 Antivirus, version of virus
signature database 4618 (20091118) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Atenciosamente,
Daniel Falcão
Analista e Desenvolvedor de Software
http://lattes.cnpq.br/2208735579737258
http://embuar.blogspot.com
http://twitter.com/embuar
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4618 (20091118) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4618 (20091118) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com
|