Olá pessoal, boa tarde!
Estou fazendo a migração de alguns sistemas e bases de dados e testes de
triggers entre outros, então criei dois esquemas onde o esquema
controle_interno estou com a base já importada e o esquema conversão onde
estou atualizando a base no momento em que preciso porém sem triggers,
indices e qualquer tipo de integridade. Estou querendo deste esquema
atualizar os dados no esquema que contém as restrições, é onde estou com
problema de atualização de registros.
Já tentei algumas coisas se como por exempo:
update controle_interno.tabelax as orv set (colunas)=(select colunas from
conversao.tabelax arv where arv.id_conversao=orv.id_conversao) where
orv.id_conversao in (select arv.id_conversao from conversao.tabelax arv
inner join controle_interno.tabelax orv on (
arv.id_conversao=orv.id_conversao) where row(arv.colunas)<>row(orv.colunas
));
Também estou criando uma função que faça o mesmo, como :
CREATE OR REPLACE FUNCTION conversao.verifica_tabela(varchar) RETURNS bool
AS $body$
DECLARE
acao varchar;
tabela varchar;
alt_tabela varchar;
colunas varchar;
colunas_comp varchar;
rcoluna varchar;
virgula bool;
saltera varchar;
rcount integer;
xxx varchar;
ftabela RECORD;
coluna RECORD;
BEGIN
tabela:=$1;
acao:='SELECT column_name,data_type FROM information_schema.columns
WHERE table_schema=''conversao'' AND table_name='''||tabela||''' AND
ordinal_position>1 ORDER BY ordinal_position';
colunas:='';
colunas_comp:='';
alt_tabela:='PREPARE alterar_tabela (';
virgula:=false;
rcount:=1;
rcoluna:='(';
FOR ftabela IN EXECUTE acao LOOP
IF (virgula) THEN
colunas:=colunas||', ';
colunas_comp:=colunas_comp||', ';
alt_tabela:=alt_tabela||', ';
rcoluna:=rcoluna||', ';
END IF;
colunas:=colunas||'arv.'||ftabela.column_name;
alt_tabela:=alt_tabela||ftabela.data_type;
rcoluna:=rcoluna||'$'||rcount;
IF (ftabela.data_type='integer' or ftabela.data_type='numeric') THEN
colunas_comp:=colunas_comp||'COALESCE(arv.'||ftabela.column_name||',0)';
ELSEIF (ftabela.data_type ~ 'timestamp' or ftabela.data_type='date')
THEN
colunas_comp:=colunas_comp||'COALESCE(quote_literal(arv.'||ftabela.column_name||'),'''')';
ELSE
colunas_comp:=colunas_comp||'COALESCE(arv.'||ftabela.column_name||','''')';
END IF;
rcount:=rcount+1;
virgula:=true;
END LOOP;
rcoluna:=rcoluna||')';
-- saltera:='EXECUTE
alterar_tabela('||replace(colunas,'arv.','ftabela.')||')';
-- alt_tabela:=alt_tabela||') AS UPDATE controle_interno.'||tabela||'
SET ('||replace(colunas,'arv.','')||') = '||rcoluna||' WHERE recnum = $1';
alt_tabela:='UPDATE controle_interno.'||tabela||' SET
('||replace(colunas,'arv.','')||') =
('||replace(colunas,'arv.','ftabela.')||') WHERE recnum = ftabela.recnum';
-- EXECUTE alt_tabela;
-- RAISE NOTICE 'alterar %',alt_tabela;
-- Exclusao
acao:='DELETE FROM controle_interno.'||tabela||' WHERE
'||tabela||'.recnum in (SELECT orv.recnum FROM conversao.'||tabela||' arv
right outer join controle_interno.'||tabela||' orv on (arv.recnum=orv.recnum)
where arv.recnum isnull)';
EXECUTE acao;
-- Inclusao
acao:='INSERT INTO controle_interno.'||tabela||'
('||replace(colunas,'arv.','')||') SELECT '||colunas||' FROM
conversao.'||tabela||' arv left outer join controle_interno.'||tabela||' orv
on (arv.recnum=orv.recnum) where orv.recnum isnull';
EXECUTE acao;
-- Alteracao
acao:='SELECT arv.* FROM conversao.'||tabela||' arv inner join
controle_interno.'||tabela||' orv on (arv.recnum=orv.recnum) where
ROW('||colunas_comp||') <> ROW('||replace(colunas_comp,'arv.','orv.')||')';
FOR ftabela IN EXECUTE acao LOOP
END LOOP;
-- DEALLOCATE alterar_tabela;
RETURN true;
END;
$body$ language 'plpgsql';
Se puderem me informar onde encontrar exemplos ou literatura para resolver
este problema fico agradecido.
[]s
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/
Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios