Ayuda con Funcion como procedimiento

From: Ricardo Martin Gomez <rimartingomez(at)hotmail(dot)com>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Ayuda con Funcion como procedimiento
Date: 2007-05-28 18:40:21
Message-ID: BAY111-W1668F30A533F65D97AF667A3280@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Buenas amigos listeros, estoy introduciendome con el uso de funciones como procedimientos almacenados y tengo bastantes problemas con esto.
Les paso mi funcion

-- Function: sinc_empresa()
-- DROP FUNCTION sinc_empresa();
CREATE OR REPLACE FUNCTION sinc_empresa() RETURNS void AS$BODY$DECLARE -- controladores de sincronizacion idDesde int; idHasta int; fechaDesde timestamp without time zone; fechaHasta timestamp without time zone; -- cursores curPais refcursor; curProvincia refcursor; curLocalidad refcursor; curDomicilio refcursor; curPersona refcursor; curPersonaFisica refcursor; curPersonaJuridica refcursor; curPersonaDomicilio refcursor; curEmpresa refcursor; curSucursal refcursor; -- registros registroPais pais_t%ROWTYPE; registroProvincia provincia_t%ROWTYPE; registroLocalidad localidad_t%ROWTYPE; registroDomicilio domicilio_t%ROWTYPE; registroPersona persona_t%ROWTYPE; registroPersonaFisica persona_fisica_t%ROWTYPE; registroPersonaJuridica persona_juridica_t%ROWTYPE; registroPersonaDomicilio persona_domicilio_r%ROWTYPE; registroEmpresa empresa_t%ROWTYPE; registroSucursal sucursal_t%ROWTYPE;
BEGIN -- CALCULAR FECHA DESDE select into idDesde COALESCE(max(idempresa),0) from empresa_t; IF (idDesde = 0) then fechaDesde:= current_timestamp - interval '25 Days'; ELSE select into fechaDesde creada from dblink('hostaddr=172.16.132.31 dbname=basename user=username password=passuser', 'select creada+ interval ''0.000001 second'' from empresa_t where idempresa = idDesde') as miDesde(creada timestamp); END IF; -- CALCULAR FECHA HASTA select into fechaHasta creada from dblink('hostaddr=10.1.1.0 dbname=basename user=username password=passuser', 'select creada from empresa_t where idempresa = (select max(idempresa) from empresa_t)')as miHasta(creada timestamp);
OPEN curPais FOR SELECT idpais, nombre, ddi FROM dblink('hostaddr=172.16.132.31 dbname=basename user=username password=passuser', 'SELECT idpais, nombre, ddi FROM pais_t WHERE creada BETWEEN '||to_char(fechaDesde, '''YYYY-MM-DD HH:MM:SS.MS''')||' AND '||to_char(fechaHasta, '''YYYY-MM-DD HH:MM:SS.MS''')|| 'OR actualizada BETWEEN '||to_char(fechaDesde, '''YYYY-MM-DD HH:MM:SS.MS''')||' AND '||to_char(fechaHasta, '''YYYY-MM-DD HH:MM:SS.MS''') ||'') as mipais(idpais bigint, nombre character varying(255), ddi bigint); --Inserta o acutaliza paises --LOOP FETCH curPais INTO registroPais; --EXIT WHEN NOT FOUND; while found loop IF (EXISTS (SELECT 1 FROM pais_t WHERE idpais = registroPais.idpais)) THEN UPDATE pais_t SET nombre=registroPais.nombre, ddi = registroPais.ddi; ELSE INSERT INTO pais_t(idpais, nombre, ddi) values (registroPais.idpais, registroPais.nombre, registroPais.ddi); END IF; END LOOP; CLOSE curPais;
END $BODY$ LANGUAGE 'plpgsql' VOLATILE;ALTER FUNCTION sinc_empresa() OWNER TO postgres;
Esta funcion compila bien y la idea es traer datos a travez de dblink() de una base a otra y actualizarlos si existen o insertarlos sino existen en la base destino.



1) como llamo a la funcion para que se ejecute?
probe con
PERFORM sinc_empresa();
ERROR: syntax error at or near "PERFORM" Estado SQL:42601 Caracter: 1

PERFORM sinc_empresa;
ERROR: syntax error at or near "PERFORM" Estado SQL:42601 Caracter: 1

execute sinc_empresa();
ERROR: syntax error at or near ")" Estado SQL:42601 Caracter: 22

execute sinc_empresa;
ERROR: prepared statement "sinc_empresa" does not existEstado SQL:26000

La unica sentencia que me devuelve algo es
select sinc_empresa();
me devuelve un registro con un campo nulo, seria algo esperable ya que intento hacer un procedimiento almacenado.

pero ....
Resulta que la cuestion mas importante que no realiza ningun insert y ningun update o sea, que aparenta no hacer nada mi funcion.

Por favor alguien que puede ayudarme a encontrarle la vuelta a este caso, que hace ya dias que lucho y sin resultados.

gracias a todos.

Saludos Martin.
_________________________________________________________________
Consigue el nuevo Windows Live Messenger
http://get.live.com/messenger/overview

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Natalia Anadon 2007-05-28 19:09:13 Re: La base de datos entra en modo de recuperacion
Previous Message Mario Cassanelli 2007-05-28 18:35:56 Re: Linkear o enlazar dos bases de datos