Oracle проверить строку на пустоту

Обновлено: 05.07.2024

Я должен написать компонент, который повторно создает таблицы SQL Server (структуру и данные) в базе данных Oracle. Этот компонент также должен принимать новые данные, введенные в базу данных Oracle, и копировать их обратно в SQL Server.

перевод типов данных из SQL Server в Oracle не является проблемой. Однако критическое различие между Oracle и SQL Server вызывает серьезную головную боль. SQL Server считает, что пустая строка ( "" ) отличается от NULL значение, поэтому char столбец можно определить как NOT NULL и все же все еще включают пустые строки в данные.

Oracle считает пустую строку такой же, как NULL значение, так что если

Я не вижу простого решения для этого.

возможно, вы можете хранить свои значения как один или несколько пробелов -> ' ' , которые не являются нулями в Oracle или отслеживают этот особый случай через дополнительные поля/таблицы и слой адаптера.

моим типичным решением было бы добавить ограничение в SQL Server, заставляющее все строковые значения в затронутых столбцах иметь длину больше 0:

однако, как вы уже заявили, у вас нет контроля над базой данных SQL. Таким образом, у вас действительно есть четыре варианта (как я вижу):

номер четыре будет моим предпочтением, но не всегда возможно. Действие, которое вы предпримете, действительно будет зависеть от того, что нужно пользователям oracle. В конечном счете, если ничего не может быть сделано о базе данных SQL, я бы объяснить проблему владельцам бизнес-системы oracle, объяснить варианты и последствия и заставить их принять решение:)

Примечание: Я считаю, что в этом случае SQL Server фактически демонстрирует "правильное" поведение.

вы должны разрешить пустые строки в системе SQL Server? Если вы можете добавить ограничение в систему SQL Server, которое запрещает пустые строки, это, вероятно, самое простое решение.

его неприятный и может иметь неожиданные побочные эффекты.. но вы можете просто вставить " chr (0)" вместо ".

NOT NULL-это ограничение базы данных, используемое для прекращения ввода недопустимых данных в базу данных. Это не служит какой-либо цели в вашей базе данных Oracle, и поэтому я бы этого не сделал.

Я думаю, вы должны просто продолжать разрешать нули в любом столбце Oracle, который отражает столбец SqlServer, который, как известно, содержит пустые строки.

Если есть логическая разница в базе данных SqlServer между NULL и пустой строкой, то вам понадобится что-то дополнительное для моделирования этого разница в Oracle.

Я бы пошел с дополнительным столбцом на стороне oracle. Пусть ваш столбец разрешает нули и имеет второй столбец, который определяет, должна ли сторона SQL-Server получить нулевое значение или пустую строку для строки.

для тех, кто думает, что Null и пустая строка должны считаться одинаковыми. Значение null отличается от значения пустой строки. Он фиксирует разницу между "undefined" и "known to be blank". В качестве примера запись может быть создана автоматически, но никогда не проверена вводом пользователя, и, таким образом, получить "null" в ожидании, что когда пользователь проверит его, он будет установлен как пустой. Практически мы можем не хотеть запускать логику на нуле, но можем хотеть на пустая строка. Это аналогично случаю для флажка состояния 3 Yes/No / Undefined.

и SQL, и Oracle не получили его полностью правильно. Пробел не должен удовлетворять ограничению "not null", и необходимо, чтобы пустая строка обрабатывалась иначе, чем обрабатывается null.

Если вы переносите данные, вам может потребоваться заменить пустую строку пробелом. Не очень элегантно, но вполне реально. Это неприятная "особенность" Oracle.

  • удалите ограничение not null из столбца Oracle
  • проверить для каждого столбца, если допустимо разместить в столбце '' или 0 или фиктивную дату, чтобы иметь возможность сохранять ваши данные.

ну, главное, что я бы рассмотрел, это отсутствие задач, когда какое-то поле может быть нулевым, то же поле может быть пустой строкой, и бизнес-логика требует различать эти значения. Поэтому я бы сделал такую логику:

  • проверьте MSSQL, если столбец не имеет нулевого ограничения
  • проверьте MSSQL, если столбец имеет проверку (столбец ") или аналогичное ограничение

Если оба значения true, сделайте столбец Oracle не NULL. Если значение равно true, сделайте столбец Oracle NULL. Если ни одно не верно, поднимите недопустимое исключение дизайна (или, возможно, проигнорируйте его, если это приемлемо для этого приложения).

при отправке данных из MSSQL в Oracle просто не делайте ничего особенного, все данные будут переданы правильно. При получении данных в MSSQL любые ненулевые данные должны быть отправлены как есть. Для нулевых строк вы должны решить, следует ли вставлять его как null или как пустую строку. Для этого вы должны снова проверить дизайн таблицы (или вспомнить предыдущий результат) и посмотреть, не имеет ли он нулевого ограничения. Если имеет - использовать пустую строку, если не имеет-использовать NULL. Просто и умно.

иногда, если вы работаете с неизвестным и непредсказуемым приложением, вы не можете проверить наличие ограничения из-за различных его форм. Если это так, вы можете использовать упрощенную логику (сделать столбцы Oracle всегда nullable) или проверить, можно ли вставить пустую строку в таблицу MSSQL без ошибок.

Я заметил, что OP упомянул следующее:

"Oracle считает пустую строку такой же, как значение NULL, поэтому, если столбец char определен как NOT NULL, вы не можете вставить пустую строку."

специально вызывая CHAR, а не VARCHAR2. Следовательно, говоря о " пустой строке" длины 0 (ie " ) является спорным. Если он объявил символ как, например, CHAR (5), то просто добавьте пробел в пустую строку, поступающую, Oracle все равно собирается заполнить его. Вы получите строку с 5 пробелами.

теперь, если OP означал VARCHAR2, ну да, это совершенно другой зверь, и да, разница между пустой строкой и NULL становится актуальной.

Читайте также: