Tengo que escribir un componente que vuelva a crear las tablas de SQL Server (estructura y datos) en una base de datos Oracle. Este componente también debe tomar nuevos datos ingresados en la base de datos Oracle y copiarlos de nuevo en SQL Server.Oracle considera que las cadenas vacías son NULL mientras que SQL Server no. ¿Cómo se maneja mejor?
Traducir los tipos de datos de SQL Server a Oracle no es un problema. Sin embargo, una diferencia fundamental entre Oracle y SQL Server está causando un gran dolor de cabeza. SQL Server considera que una cadena en blanco ("") es diferente de un valor NULL
, por lo que una columna char
se puede definir como NOT NULL
y aún así incluir cadenas en blanco en los datos.
Oracle considera una cadena en blanco a ser el mismo que un valor NULL
, por lo que si una columna se define como char
NOT NULL
, no se puede insertar una cadena en blanco. Esto está haciendo que mi componente se rompa siempre que una columna NOT NULL
char contenga una cadena en blanco en los datos originales de SQL Server.
Hasta ahora, mi solución ha sido no usar NOT NULL
en ninguna de mis definiciones de tablas espejo de Oracle, pero necesito una solución más robusta. Tiene que ser una solución de código, por lo que la respuesta no puede ser "usar el producto SQL2Oracle de tal".
¿Cómo resolvería este problema?
Edición: esta es la única solución que he encontrado hasta ahora, y puede ayudar a ilustrar el problema. Como Oracle no permite "" en una columna NOT NULL, mi componente podría interceptar cualquier valor proveniente de SQL Server y reemplazarlo por "@" (solo por ejemplo).
Cuando agrego un nuevo registro a mi tabla Oracle, mi código tiene que escribir "@" si realmente quiero insertar un "", y cuando mi código copia la nueva fila a SQL Server, tiene que interceptar el "@" y en su lugar escriba "".
Espero que haya una manera más elegante.
Edición 2: ¿Es posible que haya una solución más simple, como alguna configuración en Oracle que consiga tratar cadenas en blanco al igual que todas las otras bases de datos importantes? ¿Y esta configuración también estaría disponible en Oracle Lite?
En cuanto a su Edición 2: Existe una solución horrible que implica el uso de un CLOB para todas estas columnas. Oracle distingue entre NULL y un CLOB vacío. Puede almacenar el CLOB en línea en la tabla para reducir el impacto en el rendimiento. No haría esto (ver mi respuesta real a continuación). –
@WW .: tiene toda la razón, esa es una solución horrible. – MusiGenesis
Holy cow. SQL Server tiene su propia parte de estupidez, pero esto no tiene sentido. (¿Es esto todavía con Oracle 2014+ actual, y ha habido una configuración "ANSI NULL" para ello? SQL Server tuvo algunos problemas como este manejo previo "ANSI NULL") – user2864740