PL / SQL - установка нулевого значения - PullRequest
2 голосов
/ 20 ноября 2008

Я видел, что есть функция NVL для PL / SQL, которая заменяет значение, когда встречается ноль.
Но что, если я хочу установить поле в NULL, например

EXEC SQL UPDATE mytable SET myfield=NULL WHERE otherValue=1;

Когда я запускаю это с C ++ в HPUX, 0L используется для нуля, в то время как в Linux оператор завершается неудачно с illegal value.

Есть ли общее значение / метод нулевого значения Oracle, которое я могу использовать?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 20 ноября 2008

О, теперь я понимаю, что должно происходить. Системные заголовки C ++ имеют #define NULL 0L (в HPUX), поэтому препроцессор заменяет это значение жестко-закодированным значением NULL.

Несколько идей:

  • Просто измените регистр NULL в операторе SQL. Oracle не заботится о случае, и если он не будет точно соответствовать определенной версии, он не будет заменен. Конечно, они могли определить NULL, Null, null и т. Д. Для одного и того же значения.
  • Найдите способ отключить определение NULL в этой строке кода. Я предполагаю, что есть способ сделать это, но я действительно не знаю много о директивах препроцессора
  • Попробуйте использовать пустую строку вместо литерала NULL. Oracle должен преобразовать его в NULL.
  • Сохраните текст вашего заявления в файле конфигурации и прочитайте его в строку. Таким образом, его на самом деле не будет в коде, поэтому препроцессор не изменит его.
  • Напишите в Oracle функцию, которая просто возвращает NULL, и используйте эту функцию в своем выражении вместо литерала NULL.
1 голос
/ 20 ноября 2008

NULL должен работать как есть, но вы можете попробовать использовать переменную индикатора, как описано здесь: http://download.oracle.com/docs/cd/B10500_01/appdev.920/a97269/pc_06sql.htm#424

1 голос
/ 20 ноября 2008

NULL - правильное значение в Oracle. У меня нет опыта вызова Oracle из C ++, поэтому я не знаю, в чем причина вашей проблемы, но это должно быть проблемой на стороне клиента. Если вы выполняете этот оператор через SQLPlus Oracle, он должен делать то, что вы хотите.

0 голосов
/ 12 марта 2012

Тот факт, что вы используете оператор EXECUTE SQL, говорит о том, что вы используете Oracles Pro * C в программе на C или C ++.

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

Перед компиляцией вам нужно запустить исходный код через препроцессор Pro * C. Он переводит операторы EXEC SQL в серию структур и вызовов функций, которые может компилировать компилятор c / c ++.

Эта ссылка должна помочь с некоторыми понятиями.

0 голосов
/ 20 ноября 2008

Да - проблема в том, как NULL раскрывается в C ++. Для informix есть rsetnull, который устанавливает переменную в соответствующее значение. Есть ли что-нибудь подобное для оракула?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...