Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Немного рекурсии и области видимости / 6 сообщений из 6, страница 1 из 1
05.07.2018, 16:39
    #39670171
feagor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного рекурсии и области видимости
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare
  procedure t1(idjrn number) is
    v_jrn number:= idjrn;
    
    procedure t2(id_jrn number, is_rec boolean default false) is
      l_jrn_id int := id_jrn;
    begin
      v_jrn := id_jrn;
      DBMS_OUTPUT.PUT_LINE('t2 l_jrn_id start= '|| l_jrn_id||' '||case when is_rec=true then 'rec' else null end);
      DBMS_OUTPUT.PUT_LINE('t2 id_jrn   start= '|| id_jrn||' '||case when is_rec=true then 'rec' else null end);
      if id_jrn+1<=4 then
        t2(id_jrn+1,true);
      end if;
      DBMS_OUTPUT.PUT_LINE('t2 l_jrn_id end= '|| l_jrn_id||' '||case when is_rec=true then 'rec' else null end);
      DBMS_OUTPUT.PUT_LINE('t2 id_jrn   end= '|| id_jrn||' '||case when is_rec=true then 'rec' else null end);
    end;
  begin
    t2(v_jrn);
  end;
begin
  t1(1);
end;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
RESULT:
t2 l_jrn_id start= 1 
t2 id_jrn   start= 1 
t2 l_jrn_id start= 2 rec
t2 id_jrn   start= 2 rec
t2 l_jrn_id start= 3 rec
t2 id_jrn   start= 3 rec
t2 l_jrn_id start= 4 rec
t2 id_jrn   start= 4 rec
t2 l_jrn_id end= 4 rec
t2 id_jrn   end= 4 rec
t2 l_jrn_id end= 3 rec
t2 id_jrn   end= 3 rec
t2 l_jrn_id end= 2 rec
t2 id_jrn   end= 2 rec
t2 l_jrn_id end= 1 
t2 id_jrn   end= 4 
Почему последнее значение 4, а не 1
...
Рейтинг: 0 / 0
05.07.2018, 16:55
    #39670183
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного рекурсии и области видимости
feagorПочему последнее значение 4, а не 1Потому что in передается by reference.
...
Рейтинг: 0 / 0
05.07.2018, 17:31
    #39670211
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного рекурсии и области видимости
feagor,

так красивше результат
Код: 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.
declare
  procedure t1(idjrn number) is
    v_tmp1 varchar2(100);
    v_jrn number := idjrn;
    v_tmp2 varchar2(100);
    procedure t2(id_jrn number, is_rec boolean default false) is
      l_jrn_id number := id_jrn;
    begin
      v_jrn := id_jrn+10;
      DBMS_OUTPUT.PUT_LINE('t2 l_jrn_id start= '|| l_jrn_id||' '||case when is_rec=true then 'rec' else null end);
      DBMS_OUTPUT.PUT_LINE('t2 id_jrn   start= '|| id_jrn||' '||case when is_rec=true then 'rec' else null end);
      if id_jrn+1<=14 then
        t2(id_jrn+1,true);
      end if;
      DBMS_OUTPUT.PUT_LINE('t2 l_jrn_id end= '|| l_jrn_id||' '||case when is_rec=true then 'rec' else null end);
      DBMS_OUTPUT.PUT_LINE('t2 id_jrn   end= '|| id_jrn||' '||case when is_rec=true then 'rec' else null end);
    end;
  begin
    t2(v_jrn);
  end;
begin
  t1(1);
end;
/

SQL> /
t2 l_jrn_id start= 1
t2 id_jrn   start= 11
t2 l_jrn_id start= 12 rec
t2 id_jrn   start= 12 rec
t2 l_jrn_id start= 13 rec
t2 id_jrn   start= 13 rec
t2 l_jrn_id start= 14 rec
t2 id_jrn   start= 14 rec
t2 l_jrn_id end= 14 rec
t2 id_jrn   end= 14 rec
t2 l_jrn_id end= 13 rec
t2 id_jrn   end= 13 rec
t2 l_jrn_id end= 12 rec
t2 id_jrn   end= 12 rec
t2 l_jrn_id end= 1
t2 id_jrn   end= 24

PL/SQL procedure successfully completed.



....
stax
...
Рейтинг: 0 / 0
05.07.2018, 17:43
    #39670220
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного рекурсии и области видимости
Staxтак красивше результатРекурсия только помеха демонстрации эффекта. Наступить на грабли можно вообще не обращаясь внутри к внешней переменной и это описано в доке.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare
   n0 number;
   procedure p1(n1 number, n2 out nocopy number) is
   begin
      dbms_output.put_line('p1.b: n1='||n1||' n2='||n2);
      n2 := n1 + 1;
      dbms_output.put_line('p1.e: n1='||n1||' n2='||n2);
   end;
begin
   n0 := 10;
   p1(n0, n0);
   dbms_output.put_line('0.10: n0='||n0);
   n0 := 20;
   p1(n0+0, n0);
   dbms_output.put_line('0.20: n0='||n0);
end;
/
p1.b: n1= n2=
p1.e: n1= n2=
0.10: n0=
p1.b: n1=20 n2=
p1.e: n1=20 n2=21
0.20: n0=21
...
Рейтинг: 0 / 0
05.07.2018, 17:46
    #39670221
feagor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного рекурсии и области видимости
-2-,

ясно понятно, спасибо
...
Рейтинг: 0 / 0
05.07.2018, 18:04
    #39670227
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного рекурсии и области видимости
-2-Staxтак красивше результатРекурсия только помеха демонстрации эффекта. Наступить на грабли можно вообще не обращаясь внутри к внешней переменной и это описано в доке.

імхо не так в рекурсии, как в вызовах
t2(v_jrn); и t2(id_jrn +1 ,true);

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


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