powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Немного рекурсии и области видимости
6 сообщений из 6, страница 1 из 1
Немного рекурсии и области видимости
    #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
Немного рекурсии и области видимости
    #39670183
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagorПочему последнее значение 4, а не 1Потому что in передается by reference.
...
Рейтинг: 0 / 0
Немного рекурсии и области видимости
    #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
Немного рекурсии и области видимости
    #39670220
Фотография -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
Немного рекурсии и области видимости
    #39670221
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

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

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

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


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