Значения Oracle по умолчанию - PullRequest
1 голос
/ 13 ноября 2008

У меня быстрый вопрос о значениях по умолчанию в функциях PL / SQL в Oracle. Возьмите эту программу в качестве примера;

create or replace
FUNCTION testFunction
(
  varNumber IN NUMBER DEFAULT 0
)
RETURN NUMBER
AS
BEGIN
  dbms_output.put_line(varNumber);
  RETURN varNumber;
END;

Идея заключается в том, что если при вызове этой функции для varNumber не указано значение, оно будет принимать значение 0.

Теперь моя проблема в том, что мои функции вызываются из слоя веб-сервисов, который всегда будет передавать значение NULL в качестве значения для параметров, для которых он не имеет значения. Oracle интерпретирует NULL как значение и поэтому не инициализирует varNumber значением по умолчанию, равным 0.

Я могу понять, почему такой подход имеет смысл, но мне было интересно, есть ли способ переопределить это поведение и сделать так, чтобы при передаче значения NULL он заставлял Oracle назначать явное значение DEFAULT, которое указано в заголовке функции?

Я рассмотрел вариант выполнения ручной проверки ...

IF(varNumber IS NULL) THEN
   varNumber := 0;
END IF;

Однако существуют сотни функций, в которых это может быть проблемой, не говоря уже о большом количестве параметров для каждой функции, и поэтому я бы предпочел, чтобы я мог найти более общее решение проблемы.

Приветствует любое понимание, которое вы можете дать.

Ответы [ 3 ]

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

Используйте NVL для определения значения.

NVL( value_in, replace_with )
2 голосов
/ 13 ноября 2008

Вы не можете присвоить значения параметру IN, но вы можете сделать их IN / OUT и затем установить их. Это создает большой потенциал для неправильного использования и путаницы.

Так что я думаю, вы бы лучше справились с локальной переменной. Но вы можете сделать это в декларации. То есть

create or replace
FUNCTION testFunction
(
  varNumber IN NUMBER DEFAULT 0
)
RETURN NUMBER
AS
  vFix number := nvl(varNumber,0);
BEGIN
  dbms_output.put_line(vFix);
  RETURN vFix;
END;
1 голос
/ 13 ноября 2008

Ваша ручная проверка - единственный способ безопасно делать то, что вы хотите.

Вы можете написать это в одной строке, например:

varNumber = NVL(varNumber,0);

Удачи!

...