Problemas com postgresql

9 respostas
iltonk

boa tarde,

o problema é o seguinte estou querendo fazer uma função que interaja com array em postgres sql alguém pode me ajudar?

descrição do problema:

quero criar uma fução que faça o seguinte:

tenho um update e quero que ele interaja com um array.

exemplo:

update documentosfisicos set codigolotacaoatual = array[i] where codigodocumento
 in (
 select codigodocumento from documentosfisicos where codigolotacaoatual = array2[i]
 )

como posso fazer isso?

primeira pergunta: como declarar um array em postgres?

9 Respostas

gilluan

não seria melhor percorrer esse array e dentro de cada linha vc faz o que for preciso no banco?

iltonk

vc tem algum exemplo?

iltonk

alguém pode me ajudar!!!

gilluan

vc poderia fazer algo assim:

for (int i = 0; i < array.length; i++) {
			seleciona(array[i]); 
		}
	}

	private void seleciona(String string) {
		dao.seleciona("select codigodocumento from documentosfisicos where codigolotacaoatual = "+string);  
		
	}
gilluan

lembrando isso é só uma idéia de como poderia ser feito, não é a melhor abordagem para esse problema

javaflex

Você está querendo programar puramente em PL/pgSQL ou está usando qual tecnologia para programar?

iltonk

estou programando em plpgsql

javaflex

Veja esse exemplo: http://stackoverflow.com/questions/9783422/postgres-array-for-loop#tab-top Daí você passa o elemento como parâmetro.

Ou veja na própria documentação: http://www.postgresql.org/docs/9.1/static/plpgsql-control-structures.html

iltonk

consegui escrever a função mas está me retornando um erro alguém sabe o que está errado?

função:

CREATE OR REPLACE FUNCTION duplicacao_de_lotacao() RETURNS VOID AS 

$body$
DECLARE

lotantiga integer[3]:= 978,1436,1620;
lotnova integer[3]:= 50978,51436,51620;

contador integer:=1;

i integer:= 1;
i2 integer:= 1; 

BEGIN

LOOP

contador:= contador + 1;

	UPDATE documentosfisicos SET codigolotacaoatual = lotnova [i] WHERE codigodocumento
	IN (
	SELECT codigodocumento FROM documentosfisicos WHERE codigolotacaoatual = lotantiga [i]
	);

	UPDATE documentos SET codigolotacaoatual = lotnova[i] WHERE codigodocumento
	IN (
	SELECT codigodocumento FROM documentos WHERE codigolotacaoatual = lotantiga[i]
	);

	UPDATE processos SET codigolotacaoatual = lotnova[i] WHERE codigoprocesso
	IN (
	SELECT codigoprocesso FROM processos WHERE codigolotacaoatual = lotantiga[i]
	);

	UPDATE logins SET codigolotacao = lotnova[i] WHERE codigologin
	IN (
	SELECT codigologin FROM logins WHERE codigolotacao = lotantiga[i]
	);

	update lotacoes set codigofundamentacaolegal = 1 where codigolotacao = lotantiga[i];


i :=  i + 1;
i2 :=  i2 + 1;

EXIT WHEN contador > 3;

END LOOP;
END;

$body$

  LANGUAGE plpgsql

Erro:

ERRO:  consulta "SELECT 978,1436,1620" retornou 3 colunas
CONTEXT:  função PL/pgSQL duplicacao_de_lotacao() linha 12 durante inicialização de variável local em bloco de comandos


********** Error **********

ERRO: consulta "SELECT 978,1436,1620" retornou 3 colunas
SQL state: 42601
Context: função PL/pgSQL duplicacao_de_lotacao() linha 12 durante inicialização de variável local em bloco de comandos
Criado 13 de abril de 2013
Ultima resposta 14 de abr. de 2013
Respostas 9
Participantes 3