powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему функция вызывается 2 раза?
38 сообщений из 38, показаны все 2 страниц
Почему функция вызывается 2 раза?
    #39438850
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Проясните механизм обращения к функции:

Код: plsql
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.
// Создадим сиквенс для подсчета обращений.
CREATE  SEQUENCE sq_ttt;

// Создадим тип
CREATE TYPE TYPE_DATA_QNT AS OBJECT (
         oper_date date,
         qnt0  number,
         qnt1  number,
         qnt2  number
);
/


// Создадим функцию возвращающую объект созданного типа.
CREATE or replace 
function test_TYPE_DATA_QNT RETURN TYPE_DATA_QNT
IS
  v_sq integer;
BEGIN
  v_sq :=  sq_ttt.nextval;
  RETURN  TYPE_DATA_QNT(sysdate,0,0,0);
END;
/

// Дернем значения сиквенса
// Следующий
SELECT sq_ttt.nextval FROM dual;


Nextval
1

Код: plsql
1.
2.
// Текущий
SELECT sq_ttt.currval FROM dual;



currval
1

Код: plsql
1.
2.
3.
4.
// Вызываем функцию 2 раза, проверяем по значению сиквенса
SELECT value(test_TYPE_DATA_QNT).oper_date, value(test_TYPE_DATA_QNT).qnt0 FROM dual;

SELECT sq_ttt.currval FROM dual;


currval
3

Код: plsql
1.
2.
3.
4.
5.
6.
// Вызваем функцию во вложенном запросе - один раз.
SELECT 
      value(test_TYPE_DATA_QNT) as dat 
FROM dual;

SELECT sq_ttt.currval FROM dual;


currval
4

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// Вроде то же самое, но функция вызывается дважды, почему?
SELECT v.dat.oper_date, v.dat.qnt0
FROM
(
    SELECT 
      value(test_TYPE_DATA_QNT) as dat 
    FROM dual
) v    

SELECT sq_ttt.currval FROM dual;


currval
6

Почему в последнем запросе функция вызывается дважды, а не один раз?
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438855
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gogol,
По разу на каждый зависимый от функции элемент select кляузы. Хочешь вызвать один раз- так и скажи. Ты же оставил это на откуп оптимизатору.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438859
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
XMLer,

Как вызвать один раз?
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438860
Фотография JaRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/*+NO_MERGE*/ во внутренний запрос и будет как ждёте
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438865
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JaRo,

Да, ваша правда

Код: plsql
1.
SELECT pc.sq_ttt.currval FROM dual;



CURRVAL
18

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT v.dat.oper_date, v.dat.qnt0
FROM
(
    SELECT /*+NO_MERGE */
      value(pc.test_TYPE_DATA_QNT) as dat 
    FROM dual
) v;    

SELECT pc.sq_ttt.currval FROM dual;



CURRVAL
19

Спасибо, читаю про данный хинт.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438873
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaRo/*+NO_MERGE*/ во внутренний запрос и будет как ждёте

Будет ли?

Код: plsql
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.
SQL> SELECT sq_ttt.currval FROM dual;

   CURRVAL
----------
         3

SQL> SELECT v.dat.oper_date, v.dat.qnt0
  2  FROM
  3  (
  4      SELECT /*+ NO_MERGE */
  5        value(test_TYPE_DATA_QNT) as dat 
  6      FROM dual
  7  ) v    
  8  /

DAT.OPER_   DAT.QNT0
--------- ----------
14-APR-17          0

SQL> SELECT sq_ttt.currval FROM dual;

   CURRVAL
----------
         5

SQL>



А вот так будет:

Код: plsql
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.
SQL> create or replace
  2    type TYPE_DATA_QNT_TBL
  3      as table of TYPE_DATA_QNT
  4  /

Type created.

SQL> select  oper_date,
  2          qnt0
  3    from  table(
  4                TYPE_DATA_QNT_TBL(
  5                                  test_TYPE_DATA_QNT
  6                                 )
  7               )
  8  /

OPER_DATE       QNT0
--------- ----------
14-APR-17          0

SQL> SELECT sq_ttt.currval FROM dual;

   CURRVAL
----------
         6

SQL> 



SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438877
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GogolСпасибо, читаю про данный хинт.

Читай, может вычитаешь что hint это подсказка а не требование так-что оптимайзер может по...ить твой хинт.

SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438881
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY,

Да, интересное поведение.
Сможете написать с чем связано такое поведение хинта на разных инстансах?
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438883
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всего то хотел пару значений из функции передать не прибегая к конвеерной(pipelined) функции.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438885
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438886
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gogol,
вот поэтому изначальную задачу надо формулировать. и потом пути решения уже описывай. открой для себя in out параметры в функциях.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39438951
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VintGogol,
вот поэтому изначальную задачу надо формулировать. и потом пути решения уже описывай. открой для себя in out параметры в функциях.

Ну тут ты сVintил - нельзя функцию с OUT, IN/OUT параметрами вызвать из SQL.

SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439035
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYНу тут ты сVintил - нельзя функцию с OUT, IN/OUT параметрами вызвать из SQL.А я в 12с могу. Хоть процедуру.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439110
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicА я в 12с могу. Хоть процедуру.

Код: plsql
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.
SQL> WITH
  2    FUNCTION with_function(p_num IN NUMBER) RETURN NUMBER IS
  3    BEGIN
  4      RETURN p_num;
  5    END;
  6  SELECT with_function(deptno)
  7  FROM   dept
  8  /

WITH_FUNCTION(DEPTNO)
---------------------
                   10
                   20
                   30
                   40

SQL> WITH
  2    FUNCTION with_function(p_num IN OUT NUMBER) RETURN NUMBER IS
  3    BEGIN
  4      RETURN p_num;
  5    END;
  6  SELECT with_function(deptno)
  7  FROM   dept
  8  /
SELECT with_function(deptno)
       *
ERROR at line 6:
ORA-06553: PLS-363: expression 'P0' cannot be used as an assignment target


SQL>



SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439167
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> WITH
  2    FUNCTION get_param(p_param_name varchar2) return varchar2
  3    is
  4      i int;
  5      s varchar2(128);
  6    begin
  7      if dbms_utility.get_parameter_value(p_param_name, i, s) = 0 then
  8        return i;
  9      else
 10        return s;
 11      end if;
 12    end get_param;
 13  select get_param('compatible') from dual
 14  /

GET_PARAM('COMPATIBLE')
--------------------------------------------------------------------------
12.2.0

Код: plsql
1.
2.
3.
4.
  function get_parameter_value(parnam in     varchar2,
                               intval in out binary_integer,
                               strval in out varchar2,
                               listno in     binary_integer default 1)

...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439206
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял? Завернуть функцию с out in/out параметрами в функцию с in параметрами и вызвать её из SQL можно хоть в Oracle 7. Ты бы привел пример вызова функции с out in/out параметрами из SQL напрямую.

SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439216
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYНе понял?Это разные "задачи":
SYфункцию с OUT, IN/OUT параметрами вызвать из SQL.SYвызова функции с out in/out параметрами из SQL напрямую Поаккуратнее надо с категоричностью.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439219
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicПоаккуратнее надо с категоричностью.

Ты бы топик перечитал а не вырывал бы из контекста. А уж если "Поаккуратнее надо с категоричностью" то говорил я о вызове функции c out in/out параметрами ИЗ SQL а не ИЗ PL/SQL как в твоем примере.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439245
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYя о вызове функции c out in/out параметрами ИЗ SQL а не ИЗ PL/SQL как в твоем примере.По твоей логике получается, что ниже вызов функции из PL/SQL?
Код: plsql
1.
for c in (select udf() from dual) loop ...
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439314
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicПо твоей логике получается, что ниже вызов функции из PL/SQL?


Не прикидывайся. Ты ведь прекрасно понимаешь про SQL машину и про PL/SQL машину и про context switch и что подразумевается под вызовом UDF из SQL. Но уж если тебе так хочется, то пожалуйста - я буду "поаккуратнее надо с категоричностью" и уточню - вызов функции с out in/out параметрами из SQL предложения или, из SQL выражения (в документации используются оба термина).

SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439336
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про rownum еще никто не сказал?
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439346
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На днях материализовывал, материализовывал, но так и не выматериализовал
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439350
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Да просто все такие функции надо объявлять детерминистик..
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439359
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderДа просто все такие функции надо объявлять детерминистик..

Ага, ообенно с SYSDATE .

SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439363
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и не факт что поможет:

Код: plsql
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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
SQL> select banner from v$version
  2  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
CORE    12.1.0.1.0      Production
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production

SQL> CREATE  SEQUENCE sq_ttt;

Sequence created.

SQL> CREATE TYPE TYPE_DATA_QNT AS OBJECT (
  2           oper_date date,
  3           qnt0  number,
  4           qnt1  number,
  5           qnt2  number
  6  );
  7  /

Type created.

SQL> CREATE or replace
  2  function test_TYPE_DATA_QNT RETURN TYPE_DATA_QNT
  3  DETERMINISTIC
  4  IS
  5    v_sq integer;
  6  BEGIN
  7    v_sq :=  sq_ttt.nextval;
  8    RETURN  TYPE_DATA_QNT(sysdate,0,0,0);
  9  END;
 10  /

Function created.

SQL> SELECT sq_ttt.nextval FROM dual;

   NEXTVAL
----------
         1

SQL> SELECT v.dat.oper_date, v.dat.qnt0
  2  FROM
  3  (
  4      SELECT
  5        value(test_TYPE_DATA_QNT) as dat
  6      FROM dual
  7  ) v
  8  /

DAT.OPER_   DAT.QNT0
--------- ----------
16-APR-17          0

SQL> SELECT sq_ttt.currval FROM dual;

   CURRVAL
----------
         3

SQL>



SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439376
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

С sysdate вообще надо делать оператор, а не функцию, иначе sysdate будет меняться внутри функции. Детерминистик кстати хотя бы уменьшит количество одинаковых вызовов для разных строк за счёт кэширования, а для разных столбцов это не поможет, т.к кэширование работает для каждого столбца своё. В твоёмпримере глянь на проекции и там будет показано что функция подставилась в оба столбца. Вообще я всё это уже описывал в деталях у себя блоге.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439383
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

тестовый код
Код: plsql
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.
create or replace function f1(p varchar2) return varchar2 is
begin
   dbms_lock.sleep(1);
   return p||'-'||to_char(sysdate,'hh24:mi:ss');
end;
/
create or replace function f1d(p varchar2) return varchar2 deterministic is
begin
   dbms_lock.sleep(1);
   return p||'-'||to_char(sysdate,'hh24:mi:ss');
end;
/
col res for a10;
set timing on;
with v as (
        select 1 n
        from dual 
        connect by level<=5
        union all
        select 2
        from dual 
        connect by level<=5
)
select
  n, 'f1' f,f1(n) res
from v
union all
select 
  n, 'f1d' ,f1d(n) res
from v
/


результаты
Код: plsql
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.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
SQL> create or replace function f1(p varchar2) return varchar2 is
  2  begin
  3     dbms_lock.sleep(1);
  4     return p||'-'||to_char(sysdate,'hh24:mi:ss');
  5  end;
  6  /

Function created.

SQL> create or replace function f1d(p varchar2) return varchar2 deterministic is
  2  begin
  3     dbms_lock.sleep(1);
  4     return p||'-'||to_char(sysdate,'hh24:mi:ss');
  5  end;
  6  /

Function created.

SQL> col res for a10;
SQL> set timing on;
SQL> with v as (
  2          select 1 n
  3          from dual
  4          connect by level<=5
  5          union all
  6          select 2
  7          from dual
  8          connect by level<=5
  9  )
 10  select
 11    n, 'f1' f,f1(n) res
 12  from v
 13  union all
 14  select
 15    n, 'f1d' ,f1d(n) res
 16  from v
 17  /

         N F   RES
---------- --- ----------
         1 f1  1-20:49:41
         1 f1  1-20:49:42
         1 f1  1-20:49:43
         1 f1  1-20:49:44
         1 f1  1-20:49:45
         2 f1  2-20:49:46
         2 f1  2-20:49:47
         2 f1  2-20:49:48
         2 f1  2-20:49:49
         2 f1  2-20:49:50
         1 f1d 1-20:49:51
         1 f1d 1-20:49:51
         1 f1d 1-20:49:51
         1 f1d 1-20:49:51
         1 f1d 1-20:49:51
         2 f1d 2-20:49:52
         2 f1d 2-20:49:52
         2 f1d 2-20:49:52
         2 f1d 2-20:49:52
         2 f1d 2-20:49:52

20 rows selected.

Elapsed: 00:00:12.01

...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439385
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderС sysdate вообще надо делать оператор, а не функцию, иначе sysdate будет меняться внутри функции.

Вот тут согласен иначе получим разные значения для разных строк одного и того-же предложения, но тут и это не поможет.

SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439387
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вячеслав ЛюбомудровПро rownum еще никто не сказал?да, с точки зрения и надёжности и широты применения, rownum > 0 - самое подходящее.
А детерминистик я считаю вообще надо практически везде добавлять, кроме редких случаев когда действительно нужно чтобы каждый вызов был выполнен.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439394
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderА детерминистик я считаю вообще надо практически везде добавлятьДаже если функция не предназначена для SQL? Или на самом деле недетерминирована (да-да, такие тоже бывают)?
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439396
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Elic,

Deterministic и в pl/sql помогает - оптимизатор может перемещать выполнение или выносить из циклов. А насчёт "недетерминирована" - это я как раз отнес к тем редким случаям, когда каждый вызов важен.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439397
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439398
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderда, с точки зрения и надёжности и широты применения, rownum > 0 - самое подходящее.


И куда этот rownum втыкать? А то ведь может быть и обратный эффект:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT sq_ttt.currval FROM dual
/
SELECT v.dat.oper_date, v.dat.qnt0
FROM
(
    SELECT
      value(test_TYPE_DATA_QNT) as dat 
    FROM dual
    where rownum > 0
) v
/
SELECT sq_ttt.currval FROM dual
/



Код: plsql
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.
SQL> SELECT sq_ttt.currval FROM dual
  2  /

   CURRVAL
----------
        16

SQL> SELECT v.dat.oper_date, v.dat.qnt0
  2  FROM
  3  (
  4      SELECT
  5        value(test_TYPE_DATA_QNT) as dat
  6      FROM dual
  7      where rownum > 0
  8  ) v
  9  /

DAT.OPER_   DAT.QNT0
--------- ----------
16-APR-17          0

SQL> SELECT sq_ttt.currval FROM dual
  2  /

   CURRVAL
----------
        19

SQL>



SY.
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439400
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

это сайд-эффект от самого sql*plus'a - либо в другом клиенте, либо внутри pl/sql блока проверь:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare 
  n1 int;
  n2 int;
  oper_date date;
  qnt0  number;
begin
   SELECT sq_ttt.nextval into n1 FROM dual;
   
   SELECT v.dat.oper_date, v.dat.qnt0
     into oper_date,qnt0
   FROM
   (
       SELECT
         value(test_TYPE_DATA_QNT) as dat 
       FROM dual
       where rownum > 0
   ) v;
   SELECT sq_ttt.currval into n2 FROM dual;
   dbms_output.put_line(n1||' '||n2);
end;
/

...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439401
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SY,

либо просто первой строкой отфетчить что-нибудь ненужное:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT sq_ttt.nextval FROM dual
/
select sysdate, null from dual union all
SELECT (v.dat).oper_date, (v.dat).qnt0
FROM (
    SELECT
      test_TYPE_DATA_QNT as dat 
    FROM sys.dual
    where rownum>0
) v
/
SELECT sq_ttt.currval FROM dual
/
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439416
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SYJaRo/*+NO_MERGE*/ во внутренний запрос и будет как ждёте

Будет ли?

Код: plsql
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.
SQL> SELECT sq_ttt.currval FROM dual;

   CURRVAL
----------
         3

SQL> SELECT v.dat.oper_date, v.dat.qnt0
  2  FROM
  3  (
  4      SELECT /*+ NO_MERGE */
  5        value(test_TYPE_DATA_QNT) as dat 
  6      FROM dual
  7  ) v    
  8  /

DAT.OPER_   DAT.QNT0
--------- ----------
14-APR-17          0

SQL> SELECT sq_ttt.currval FROM dual;

   CURRVAL
----------
         5

SQL>

к слову, тут тоже "магия" sql*plus'a
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439495
Gogol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тему про возврат нескольких значений функцией для выражения SELECT вынес в отдельную тему.
http://www.sql.ru/forum/1257342-a/kakie-sposoby-est-chtoby-funkciya-vernula-nabor-poley-i-kak-ispolzovat-v-select
...
Рейтинг: 0 / 0
Почему функция вызывается 2 раза?
    #39439561
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,
видимо надо кроме зеленого смайлика еще какой нибудь вводить. чтобы было понятна что это шутка на фразу "Всего то хотел пару значений из функции передать не прибегая к конвеерной(pipelined) функции" учитывая описания автора можно было домыслить что угодно. жаль поздно заметил что вы там развели бурную дискуссию по этой теме)
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему функция вызывается 2 раза?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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