Multiples Motores

SQL, mySQL, postgreSQL y otros motores
Responder
osquiabro
Al nivel de RZ
Mensajes: 179
Registrado: Dom Feb 06, 2011 10:06 pm
Contactar:

Multiples Motores

Mensaje por osquiabro » Lun Oct 03, 2011 11:51 am

Saludos tengo una consulta, necesito saber cual es la forma mas practica para que una aplicacion funcione con diferentes motores en mi caso con ORACLE(ELCARO al reves) y MSSSQL.

Me imagino que se tiene que ir por la linea de ODBC, pero la pregunta es como debo manejar los campos para crear compatibilidad con ambos y sobre todo el asunto de los campos de fechas.

Otro asunto serian los trigger y SP .

En fin se puede sin tener que invertir mucho tiempo en modificaciones
Saludos!

Omar Squiabro
Puerto Rico


Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1125
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

Re: Multiples Motores

Mensaje por Mauricio » Lun Oct 03, 2011 12:21 pm

Hola Omar,
el que más información te puede dar sobre esto es Leo Palomares ya que en la empresa donde él está trabajan con ambos motores.
Con respecto a los campos hay que tener algunas consideraciones, como usar PDECIMAL para Oracle en lugar de DECIMAL (y el PDECIMAL te va a servir también para MS SQL).
El problema más grande te lo vas a encontrar, como suponías, en los store procedures, a pesar de que ambos son SQL no son muy compatibles en el lenguaje en sí. Muchas veces teníamos que escribir sp o código embebido preguntando antes cuál era el driver de la aplicación (no sé si cambió pero en Oracle los LEFT OUTER JOIN no podías escribirlos como en MS SQL).
No es una tarea fácil pero tampoco es imposible.
Esperemos que lee aporte más :)
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog

LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

Re: Multiples Motores

Mensaje por LeoPalomares » Mié Oct 05, 2011 7:45 pm

Hola Omar,

Te cuento un poco nuestra experiencia.
Nuestras aplicaciones son compatibles con SQL Server, Oracle e Informix. Para SQL Server y Oracle usamos los drivers nativos de Clarion y para Informix usamos ODBC.
En tu caso podrías trabajar con ODBC directamente para todos los casos ya que hoy día la sobrecarga que agrega la capa de ODBC es insignificante.

En cuanto al código depende mucho de como vayas a trabajar en tu aplicación, mientras los accesos a datos los hagas con código Clarion 100% te será transparente con que motor trabajes pero... esta facilidad tiene su precio y muchas veces este precio se paga en un mal rendimiento de la aplicación o una escalabilidad muy pobre. Por estos motivos, entre otros, es que más temprano que tarde terminarás escribiendo consultas sql en tu código y ahí es donde, a veces, deberás tener que tener en cuenta el motor ya que no siempre la sintaxis a usar es compatible de un motor a otro.
Con las versiones actuales de Oracle y SQL Server tenés un alto grado de compatibilidad en la sintaxis básica de SQL (como el tema del LEFT OUTER JOIN que comenta Mauricio que en Oracle hace ya un tiempo que se pueden escribir con la sintaxis del estandard ANSI y no con la sintaxis propietaria).

Uno de los grandes problemas es el tema de las fechas y las horas, acá hay varias alternativas pero no hay una solución universal.
Lo recomendable es usar los tipos de datos del motor y crear funciones (en la aplicación) para simplificar el uso de este tipo de datos.

Hasta acá todo más o menos simple pero.... el GRAN TRABAJO es cuando querés usar stored procedures y triggers.
La sintaxis es totalmente diferente entre ambos motores, no se parecen en nada!!! vas a tener siempre DOBLE TRABAJO, no hay alternativas a esto.

Cualquier duda que tengas no dejes de consultarla que entre todos intentaremos aclararla.
Saludos!!!

Leo Palomares

osquiabro
Al nivel de RZ
Mensajes: 179
Registrado: Dom Feb 06, 2011 10:06 pm
Contactar:

Re: Multiples Motores

Mensaje por osquiabro » Mié Oct 05, 2011 8:07 pm

Leo gracias por la respuesta, actualmente he trabajado con ambos motores y la pregunta vino precisamente por la forma en que ORACLE maneja las fechas en adiccion uso mucho los triggers en SQL Server.

Pronto tengo que crear una aplicacion que sea compatible con ambos motores por que en su origen se utilizara SQL server pero luego se movera a ORACLE y queria anticipar los problemas que me encontraria en el camino.
Saludos!

Omar Squiabro
Puerto Rico

LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

Re: Multiples Motores

Mensaje por LeoPalomares » Jue Oct 06, 2011 6:05 am

Pues si, una de las grandes diferencias es el manejo de fechas. En Oracle el tipo de dato DATE es un DateTime y para pasarlo a un formato legible tenés que usar TO_CHAR(Fecha, Máscara) y para la conversión inversa TO_DATE(StringFecha, Máscara).
Otras cosas importantes a tener en cuenta son:
Oracle es sensible a mayúsculas y minúsculas por lo no es lo mismo
SELECT * FROM Clientes WHERE Nombre = 'Leo' que SELECT * FROM Clientes WHERE Nombre = 'LEO'
Vas a tener que ir con cuidado con los tipos de dato CHAR y los espacios ya que en esos casos para Oracle no es lo mismo '' que ' ' y tampoco es lo mismo 'Leo' que 'Leo ' (lo mejor es usar CString en Clarion, VARCHAR en SQL Server y VARCHAR2 en Oracle).

Por otro lado ojo con los triggers, no es una buena práctica basar la programación en triggers por varios factores, los más importantes son rendimiento (la sobrecarga de trabajo en el servidor es notoria y limita mucho la escalabilidad de la aplicación) e impredictibilidad (un trigger, sobre todo en Oracle, puede pasar a estado de "desactivado" por un cambio en los objetos dependientes y esto no ocasionará ningún error visible en la aplicación por lo que no sabrás que no está funcionando hasta que no detectes un fallo funcional).
Otra cosa más de los triggers, ojo porque los criterios de activación son diferentes en Oracle y en SQL Server por lo que representar la misma lógica te puede llegar a ser complicado.
Y por si eso fuera poco te podés enfrentar con problemas totalmente desconocidos en el entorno de SQL Server como ser el de las tablas mutantes (bonito nombre no?).

La seguimos...
Saludos!!!

Leo Palomares

Avatar de Usuario
Mauricio
Desarrollador de Clarion
Mensajes: 1125
Registrado: Dom Feb 06, 2011 9:34 am
Ubicación: España
Contactar:

Re: Multiples Motores

Mensaje por Mauricio » Jue Oct 06, 2011 7:01 am

El manejo de los campos IDENTITY es distinto también, no?. En Oracle tenías las secuencias, no sé si eso también ha cambiado.
Mauricio, básicamente usando Clarion 6.3
www.tdcsoftware.com y www.clarioneros.com/blog

LeoPalomares
Ayudante de Santa
Mensajes: 53
Registrado: Lun Feb 07, 2011 10:50 pm
Contactar:

Re: Multiples Motores

Mensaje por LeoPalomares » Jue Oct 06, 2011 7:28 pm

Estás en lo cierto Mauricio, los Identity en Oracle no existen, de todas formas esto no suele ser un gran problema.
Generalmente los identity se utilizan para autonumerar registros y en estos casos hay dos situaciones típicas
1) cuando la numeración la dejamos en manos del motor y no necesitamos conocer el nro generado
2) idem a 1 pero si necesitamos conocer el nro generado (por ejemplo para propagar el ID del padre en registros hijos)

En el caso 1 es más simple en SQL Server ya que con definir el campo como Identity está todo resuelto
En Oracle es necesario declarar una sequence y asociar un trigger a la tabla a autonumerar para que se resuelva automáticamente la autonumeración cuando se inserta un registro. Esto es un poco más de trabajo, no tiene complejidad pero hay que hacerlo. Yo me hice un stored procedure al que lo ejecuto indicándole la tabla y el campo a autonumerar y el se encarga de crear la secuencia y el trigger (el que lo necesite que me lo pida que le lo paso).

En el caso 2 es más simple en Oracle que en SQL Server ya que con obtener el próximo número de la secuencia ya se puede usar tanto para los registros hijos como para el padre (Oracle garantiza que una vez otorgado un número de secuencia ese número no se vuelve a otorgar (a menos que uno regenere la secuencia y la inicialice con un valor más bajo de los ya usados)).
La sintaxis es muy simple:
SELECT s_Cliente.NextVal() FROM DUAL;
obtiene el próximo valor de la secuencia. Este valor se puede asignar a una variable local de la aplicación y usarla donde se necesite.
Saludos!!!

Leo Palomares


Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 15 invitados