Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Порядок вызова функций в SQL / 10 сообщений из 10, страница 1 из 1
27.03.2003, 10:04
    #32127896
andsm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
Пусть имеется запрос:
select что-то from TableName where ColumnName=ФункцияВПакетеБезПараметров.

Пусть в таблице N записей.
Вопрос: Функция будет вызвана 1 раз или N?
...
Рейтинг: 0 / 0
27.03.2003, 10:48
    #32127947
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
Я был уверен, что 1. Но решил проверить, и несколько озадачился:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
create or replace function get_number return number as
  v_pipe integer;
  PIPE_NAME varchar2( 16 ) := 'GET_NUMBER';
begin
  v_pipe := dbms_pipe.create_pipe (
      pipename => PIPE_NAME
    , maxpipesize =>  32768 
  );
  dbms_pipe.pack_message('call get_number');
  v_pipe := dbms_pipe.send_message(PIPE_NAME);
  if v_pipe !=  0  then
    raise_application_error (
        - 20000 , 'Error:'||to_char(v_pipe)||' sending on pipe!'
    );
  end if;
  return  1 ;
end;
/
exec :result := dbms_pipe.remove_pipe('GET_NUMBER');

select e.empno from scott.emp e where e.empno = get_number
/

declare v_message integer;
        v_text varchar2( 64 );
        PIPE_NAME varchar2( 16 ) := 'GET_NUMBER';
begin
  dbms_output.enable( 20000 );
  loop
    v_message := dbms_pipe.receive_message(PIPE_NAME,  0 );
    exit when v_message !=  0 ;
    if v_message =  0  then
      dbms_pipe.unpack_message(v_text);
      dbms_output.put_line(v_text);
    end if;
  end loop;
end;
/


У меня стабильно получается 2 вызова. На других таблицах- то же самое, количество вызовов не один, но и не равное числу записей в таблице. Может, в чем-то ошибся?
...
Рейтинг: 0 / 0
27.03.2003, 12:58
    #32128065
Блин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
я при вызове функции писал в файл по 1 строчке.
количество строк не только не совпадало с количеством возвращаемых записей но и было больше иногда, а иногда и меньше.
если кто знает по этому поводу что-нить просветите.
...
Рейтинг: 0 / 0
27.03.2003, 13:32
    #32128111
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
Я тоже немного ковырялся по этому поводу. У меня получилось кол-во вызовов=число записей. Deterministic на функцию не помог. Это в том случае ,
когда сравнивается КОЛОНКА. Если вместо нее, например, константа то 1 вызов
...
Рейтинг: 0 / 0
27.03.2003, 13:51
    #32128139
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
А как быть с этим?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
dan@oraspb>; create or replace function get_number return number as
   2   begin
   3     dbms_output.put_line('call get_number');
   4     return  1 ;
   5   end;
   6   /               

Function created.

dan@oraspb>; set serverout on
dan@oraspb>; select count(*) from scott.emp where empno = get_number;

  COUNT(*)
 ----------
 
          0 

dan@oraspb>; exec dbms_output.enable( 20000 );
call get_number
call get_number

PL/SQL procedure successfully completed.

dan@oraspb>; select count(*) from scott.emp where empno != get_number;

  COUNT(*)
 ----------
 
         14 

dan@oraspb>; exec dbms_output.enable( 20000 );
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
call get_number
...
Рейтинг: 0 / 0
27.03.2003, 13:54
    #32128145
Блин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
во-во примерно так у меня и получалось
...
Рейтинг: 0 / 0
27.03.2003, 14:37
    #32128186
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
Ну дык - от плана запроса зависит ведь ! Денис,
select /*+ full(t)*/ count(*) from scott.emp t where empno = get_number

14 раз ?

Вот почему deterministic не работает :-( Хочу чтоб без всяких там селектов из дуалов один раз вызывалась
...
Рейтинг: 0 / 0
27.03.2003, 15:00
    #32128217
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
Да, действительно, если TABLE ACCESS FULL, то вроде как функция вызовется по разу на запись. А при чем тут DETERMENISTIC? Из определения, "DETERMINISTIC keyword to indicate that the function will always return the same output return value for any given set of input argument values, now and in the future."

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96524/c19depnd.htm#4374

Поставил я у функции эту кляузу, ну и что? Ситуация не изменилась.

Интеесно, а почему все-таки по индексу SCOTT.EMP(EMPNO) функция 2 раза дернуласть? Можно ли одной фразой ответить на исходный вопрос, т.е. сколько раз вызовется функция, с учетом всех факторов?
...
Рейтинг: 0 / 0
27.03.2003, 15:16
    #32128236
va_kochnev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
Напишите
select e.empno from scott.emp e where e.empno in (select get_number from dual)
и не парьтесь
...
Рейтинг: 0 / 0
27.03.2003, 16:08
    #32128330
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Порядок вызова функций в SQL
2 Denis
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005493

Я надеялся, что оптимизатор может сообразить - не надо повторно вызов делать :-(

Почему два вызова - не знаю. Не могу придумать причину, по которой ораклю это надо.

>Можно ли одной фразой ответить на исходный вопрос, т.е. сколько раз >вызовется функция, с учетом всех факторов?
Столько, сколько раз изменялся предикат во where в соответствии с планом запроса, плюс один, если использовался индекс :-) шучу.

2va_kochnev
любопытно все ж
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Порядок вызова функций в SQL / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]