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

Responder a