Функция Oracle всегда возвращает ноль - PullRequest
4 голосов
/ 24 мая 2010

Я не могу заставить эту функцию вести себя так, как мне хочется. Кто-нибудь может указать, почему он всегда возвращает ноль вместо CURRENT_TIMESTAMP?

CREATE OR REPLACE FUNCTION nowts RETURN TIMESTAMP IS

vTimestamp TIMESTAMP;

BEGIN
  SELECT type_date
  INTO vTimestamp
  FROM param_table
  WHERE param_table = 3
  AND exists (
     SELECT *
     FROM param_table 
     WHERE param_table = 2
  );

  IF vTimestamp IS NULL THEN
    vTimestamp := CURRENT_TIMESTAMP;
  END IF;

  return vTimestamp;
END nowts;

Сейчас в таблице нет ничего с именем param_table.

Ответы [ 2 ]

5 голосов
/ 24 мая 2010

Если вы вызываете функцию из SQL и функция вызывает NO_DATA_FOUND, вы получаете NULL.

SQLCODE из NO_DATA_FOUND равен +100, тогда как код PL / SQL равен -1403. Ref

Положительное число не является ошибкой, и SQL не рассматривает концепцию NO_DATA_FOUND как исключение.SQL видит его как «Нет значения», что является нулевым.

create or replace function ret_dt return date is
begin
  raise no_data_found;
end;
/
Elapsed: 00:00:00.26
> select rownum ,ret_dt from user_tables where rownum < 5;
         ROWNUM RET_DT
--------------- -----------------
           1.00
           2.00
           3.00
           4.00

Вы, вероятно, хотите перехватить его и вернуть определенное значение, или перехватить его и вызвать исключение, определяемое пользователем (в зависимости от того, что вы хотитебывает).

5 голосов
/ 24 мая 2010

Если строк нет, выбор в будет вызывать исключение NO_DATA_FOUND.

Добавить до КОНЦА Nowts

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