Los sistemas que actualmente uso y se conectan al MSSQL2000 estan hechos en VisualBasic 6 y en Delphi 5, ya hice pruebas de conectividad y uso de PGSQL con estos lenguajes y todo bien usando el driver OleDB de Postgres (http://pgfoundry.org/projects/oledb/). Generar la cadena de conexion es muy sencillo, en todo caso un ejemplo seria:
CadConn = "Provider=PostgreSQL OLE DB Provider;" & _
"Password=mipassword;User ID=miusuario;" & _
"Data Source=localhost;Location=mibasededatos;Extended Properties='';"
El Unico detalle aqui es un problema del driver cuando uno lanza SQLs que devuelven registros, provoca un error de retorno, pero esto no sucede si se hace a traves de SPs.
Ok ahora si a las bases de datos; primero unos alcances: MSSQL usa como lenguaje de programacion Transact-SQL(T-SQL) y PostgreSQL PlPgSQL, para postgres no es el unico, se pueden instalar otros como java, c, etc ,etc. Pero el mas usado y casi por default es PLPGSQL. Asi que dare alguno tips para hacer esta tarea un poco mas sencilla.
Existe una herramienta que se llama SQLWays(http://www.ispirer.com/products) que ofrece hacer dicha migracion, es realmente util, pero siempre hay que revisar lo que ha migrado, ademas al hacer esta tarea de manera automatizada hay muchos SPs que no son optimos o que no se ejecutan.
Ok entonces vamos a los tips especificos
1. En PGSQL no existen "Procedimientos Almacenados" como tales, sino mas bien "Funciones Almacenadas", eso quiere decir que siempre estaremos obligados a devolver algo desde nuestros "SPs".
2. Declaracion de variables:
MSSQL: se usa la palabra DECLARE y el nombre debe empezar con el simbolo @ , por ejem:
DECLARE @mivar INT
PGSQL: se hace el estilo de C o de java, es decir identificador seguido del tipo de dato, por ejem:
mivar int;
3. Las asignaciones de valores a variables:
MSSQL: se usa SET , ejem:
SET @mivar=1.12
PGSQL: se usa el simbolo := , ejem:
mivar:=1.12;
4. Devolucion de registros o filas, uno de los mas importantes tips creo yo.
MSSQL: se hace el select directamente y punto, por ejem: :o)
create procedure consulta as
select * from mitabla
PGSQL: como dije anteriormente en PGSQL se usan "funciones Almacenadas" por lo que debemos indicar a nuestra funcion el tipo a devolver. Lo mejor es usar el tipo pg_catalog.refcursor, que creo que esta disponible recien desde la version 8.x de PGSQL.
CREATE OR REPLACE FUNCTION consulta() RETURNS "pg_catalog"."refcursor" AS
declare data refcursor;
begin
open data for (
Select * from mitabla
);
return data;
END;
5. Recorrer cursores dentro de los SPs.
MSSQL:
declare @v_1 varchar(10)
declare @v_2 varchar(10)
declare cur1 cursor for
select * from mitabla
OPEN cur1
FETCH NEXT FROM cur1
INTO @v_1, @v_2
WHILE @@FETCH_STATUS = 0 BEGIN
print 'Valor 1 '+v_1
print 'Valor 2 '+v_2
FETCH NEXT FROM cur1
INTO @v_1, @v_2
END
CLOSE cur1
PGSQL:
declare
cur1 refcursor;
v_1 varchar (10) ;
v_2 varchar (10) ;
begin
OPEN cur1 FOR execute('select * from mitabla');
loop
fetch cur1 into v_1, v_2;
if not found then
exit ;
end if;
RAISE NOTICE 'Valor 1(%)', v_1;
RAISE NOTICE 'Valor 2(%)', v_2;
end loop;
close cur1;
end;
* Existe otra forma de recorrer registros en PGSQL, pueden ver mas detalles en http://www.postgresql.org/docs/8.3/interactive/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING.
6. Bueno este tip mas que de SPs, es para la carga de data, mis tablas en MSSQL son de millones de registros asi que la mejor manera de pasar la data del MSSQL a PGSQL es:
1ero. Bajar la data del MSSQL a texto plano, tipo csv, es decir valores separados por comas.
2do. Usar el comando COPY.. FROM de PGSSQL para cargar a data desde los arhivos de texto a las tablas de PGSQL.
Ok, es todo hasta ahora, si veo algo mas lo publicare o si alguien mas puede dar un aporte bienvenido.