Найти ошибку

Только что коллега обратился с вопросом: почему один и тот же запрос возвращает разные результаты в зависимости от того, вызван он прямо или "упакован" в функцию. Я потратил минут 20 на анализ простого кода, но так ничего и не нашел.

Запрос отдельно:

select max(LENGTH)
    from TUBES 
    where TUBES.NAME LIKE 'tube1'

Функция:

create or replace FUNCTION "GET_TUBE_LENGTH" ( 
  NAME IN VARCHAR
) RETURN NUMBER AS
  depth NUMBER;
BEGIN

    select max(LENGTH) into depth
    from TUBES
    where TUBES.NAME LIKE NAME;

  RETURN depth;
END GET_TUBE_LENGTH;

Если выполнить запрос отдельно, получаем NULL
Если вызвать функцию:

SELECT GET_TUBE_LENGTH('tube1') FROM DUAL;

получаем 1000!

Еще через 10 минут, он написал мне что решил проблему:
Название параметра функции совпадает с именем поля в таблице TUBES и оператор like сравнивает не со значением параметра, а с значением поля.

Коментарі

Tonya Mina каже…
Вот почему хорошей практикой считается в именах параметров функций и процедур делать префиксы типа ip_...(input parameter) и op_...(output parameter)

Популярні дописи з цього блогу

OAuth-аутентификация через ВКонтакте

Українська мова