2008-11-20 4 views
2

Я видел, что существует функция NVL для P/SQL, которая заменяет значение, когда встречается нуль. Но что, если я хочу установить поле в NULL, например. EXEC SQL UPDATE mytable SET myfield = NULL WHERE otherValue = 1;P/SQL - значение null

Когда я запускаю это с C++ на HPUX, 0L используется для null, а на Linux утверждение не выполняется с «незаконным значением».

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

Спасибо.

ответ

1

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

0

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

4

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

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

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

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

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

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

This link должен помочь с некоторыми концепциями.