2010-05-23 3 views
4

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

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 нет ничего.

+0

@OMG Ponies, как проверить, установлено ли что-либо? – JavaRocky

ответ

4

При вызове функции из 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

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

Добавить до конца nowts

exception 
    when no_data_found then 
    return CURRENT_TIMESTAMP; 
+0

Спасибо за подсказку. Я также обнаружил, что если вам нужно поймать исключение до конца функции, вы можете поместить выбор в субблок BEGIN..END и поместить обработчик исключений внутри этого субблока (имитируя блок TRY..CATCH, который вы будете использовать в Другие языки). –

Смежные вопросы