2013-09-02 4 views
0

Я создал функцию в oracle, и я заметил, что ее возвращающая ничего/пустая строка.Возвращение ничего в функции Oracle

Oracle Функция

CREATE OR REPLACE function UDF_GET_STATUS(P_ID in NUMBER) 
return NVARCHAR2 is 

    l_status NVARCHAR2(25); 

begin 

select case 
      when exists(select ID, STATUS 
         from Transaction 
         where ID = P_ID AND STATUS = 1) 
      then 'APPROVED' 
      else 'FOR APPROVAL' 
      end into l_status 
      from Transaction WHERE ID = P_ID; 

    return l_status; 

end; 

ли я что-то пропустил? Пожалуйста, советы ..

Спасибо,

ответ

2

Это, скорее всего, вызванные вами, не имея никакого результата, который соответствует вашему запросу. Oracle позволит вашей функции вернуться, но вернет результат NULL.

Исключено исключение NO_DATA_FOUND в PL/SQL, но оно не распространяется на ваш SQL. Я бы предположил, что идентификатор, который вы передаете своей функции, не существует в вашей таблице. Пожалуйста, см. Мой ответ here для объяснения.

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

create or replace function UDF_GET_STATUS(P_ID in number 
    ) return nvarchar2 is 

    l_status number; 

begin 

    select count(*) into l_status 
    from transaction 
    where id = P_ID 
     and status = 1 
     and rownum < 2 
      ; 

    if l_status = 0 then 
     return 'FOR APPROVAL'; 
    else return 'APPROVED'; 
    end if; 

end; 
/

Как ваш запрос является СУЩЕСТВУЕТ вам нужен только один строка, которая выполняет условие, поэтому вы можете использовать ROWNUM, чтобы ограничить результаты, которые вы можете получить.

Это также немного любопытно, что вы возвращающая NVARCHAR2 здесь ...

+0

это странно .. Она также возвращает ничего/пустая строка – user2729205

+0

Что, эта функция @ user2729205? Вы настроены на получение nvarchar2? – Ben

+0

, чтобы получить статус транзакции. если статус равен 1, то он уже одобрен. – user2729205

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