Функция Oracle и запрос возвращают разные результаты - PullRequest
3 голосов
/ 21 января 2010

Я использую базу данных Oracle 10g.

Функция:

create or replace FUNCTION FUNC_FAAL(myCode number,firstDate date
  , secondDate date) 
  RETURN INTEGER as
  rtr integer;
BEGIN
  select count(*) into rtr 
  from my_table tbl where tbl.myDateColumn between firstDate and 
          secondDate and tbl.kkct is null and tbl.myNumberColumn  = myCode ;
  return (rtr);
END FUNC_FAAL;

Эта функция возвращает 117177 в качестве результата.

Но если я выполню один и тот же запрос в функции отдельно;

select count(*)
from my_table tbl 
where tbl.myDateColumn between firstDate and secondDate 
and tbl.kkct is null and tbl.myNumberColumn  = myCode ;

Я получаю другой результат 11344 (который является правильным).

В чем может быть проблема?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 21 января 2010

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

 create or replace FUNCTION FUNC_FAAL(myNumberColumn number,firstDate date
  , secondDate date) 
  RETURN INTEGER as
  rtr integer;
BEGIN
  select count(*) into rtr 
  from my_table tbl where tbl.myDateColumn between firstDate and 
          secondDate and tbl.kkct is null and tbl.myNumberColumn  = myNumberColumn ;
  return (rtr);
END FUNC_FAAL;

где параметр или локальная переменная имеет то же имя, что и столбец в таблице. В SQL столбец таблицы имеет приоритет, поэтому переменная не используется, и столбец сравнивается с самим собой, что дает большее количество совпадений.

Лучше всего ставить префикс переменных и параметров (например, v_ и p_), чтобы избежать таких проблем.

2 голосов
/ 21 января 2010

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

, если это так, указание имени таблицы как полностью определенного (schema.table) должно решить проблему.

1 голос
/ 21 января 2010

Я бы запустил TKPROF, чтобы увидеть, какой SQL вы на самом деле обрабатываете в базе данных, в частности, чтобы узнать, как распознаются переменные даты.

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