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

Пусть в таблице N записей.
Вопрос: Функция будет вызвана 1 раз или N?
...
Рейтинг: 0 / 0
Порядок вызова функций в SQL
    #32127947
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я был уверен, что 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
Порядок вызова функций в SQL
    #32128065
Блин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я при вызове функции писал в файл по 1 строчке.
количество строк не только не совпадало с количеством возвращаемых записей но и было больше иногда, а иногда и меньше.
если кто знает по этому поводу что-нить просветите.
...
Рейтинг: 0 / 0
Порядок вызова функций в SQL
    #32128111
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже немного ковырялся по этому поводу. У меня получилось кол-во вызовов=число записей. Deterministic на функцию не помог. Это в том случае ,
когда сравнивается КОЛОНКА. Если вместо нее, например, константа то 1 вызов
...
Рейтинг: 0 / 0
Порядок вызова функций в SQL
    #32128139
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как быть с этим?

Код: 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
Порядок вызова функций в SQL
    #32128145
Блин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
во-во примерно так у меня и получалось
...
Рейтинг: 0 / 0
Порядок вызова функций в SQL
    #32128186
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну дык - от плана запроса зависит ведь ! Денис,
select /*+ full(t)*/ count(*) from scott.emp t where empno = get_number

14 раз ?

Вот почему deterministic не работает :-( Хочу чтоб без всяких там селектов из дуалов один раз вызывалась
...
Рейтинг: 0 / 0
Порядок вызова функций в SQL
    #32128217
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, действительно, если 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
Порядок вызова функций в SQL
    #32128236
va_kochnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напишите
select e.empno from scott.emp e where e.empno in (select get_number from dual)
и не парьтесь
...
Рейтинг: 0 / 0
Порядок вызова функций в SQL
    #32128330
ora600
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Denis
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005493

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

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

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

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


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