powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ну ладно бы 13 или 14....
25 сообщений из 28, страница 1 из 2
Ну ладно бы 13 или 14....
    #39679482
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DECLARE
  i INTEGER;
  FUNCTION INC(iI IN INTEGER) RETURN INTEGER AS
  BEGIN
    RETURN iI + 1;
  END; 
BEGIN
  i:= 5;
  i:= INC(i) + INC(i);
  DBMS_OUTPUT.PUT_LINE ('i = '|| i);
END;



получили 12

Результат противоречит результатам в подавляющем большинстве языков. Это как то закреплено докой?
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679486
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLer...
получили 12

...Это как то закреплено докой?

то что 6+6=12?
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679490
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

То что 6+6 а не 6 + 7
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679496
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLer,

INC(i) - это Ваша функция которая вернет 6 = INC(5)

а не встроенная функция inc() (инкримент) которая заметяет значение переменной на значение+1 и тогда в памяти по указателю i будет лежать 6 и повторный inc(i) сделает его 7
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679498
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLer,

При Вашем написании переменная i еказывает на ячейку памяти со значением 5 вплоть до того пока ее не переопределят в 12.
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679499
merch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLer,


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
set serveroutput on
declare
  i integer;
  function inc(ii in out integer) return integer as
  begin
    ii := ii + 1;
    return ii;
  end; 
begin
  i:= 5;
  i:= inc(i) + inc(i);
  dbms_output.put_line ('i = '|| i);
end;
/
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679502
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerЭто как то закреплено докой?RTFM Subprogram Parameter Passing Methods (FAQ)
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679505
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerпротиворечит результатам в подавляющем большинстве языков.Возможно твое личное большинство тебя подавляет как-то особенным образом.
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679537
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerРезультат противоречит результатам в подавляющем большинстве языков.

Покажи пример хотя бы на одном языке, который вернёт не 12.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Program ii;
{$APPTYPE CONSOLE}

var
  i: Integer;

function myInc(x: Integer): Integer;
begin
   Result := x + 1;
end;

begin
   i := 5;
   i := myInc(i) + myInc(i);
   WriteLn(i);
end.


Выводит 12.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679559
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLer
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DECLARE
  i INTEGER;
  FUNCTION INC(iI IN INTEGER) RETURN INTEGER AS
  BEGIN
    RETURN iI + 1;
  END; 
BEGIN
  i:= 5;
  i:= INC(i) + INC(i);
  DBMS_OUTPUT.PUT_LINE ('i = '|| i);
END;



получили 12

Результат противоречит результатам в подавляющем большинстве языков. Это как то закреплено докой?Это правильное поведение, в том числе с точки зрения дизайна приложения: это детерминированная функция без побочных эффектов.
https://ru.wikipedia.org/wiki/Побочный_эффект_(программирование) Побочный эффект функции — возможность в процессе выполнения своих вычислений: читать и модифицировать значения глобальных переменных, осуществлять операции ввода-вывода, реагировать на исключительные ситуации, вызывать их обработчики. Если вызвать функцию с побочным эффектом дважды с одним и тем же набором значений входных аргументов, может случиться так, что в качестве результата будут возвращены разные значения. Такие функции называются недетерминированными функциями с побочными эффектами.
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679568
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerполучили 12

Результат противоречит результатам в подавляющем большинстве языков.

Python:
Код: python
1.
2.
3.
4.
5.
def INC(iI):
    return iI+1
i=5
i=INC(i)+INC(i)
print('i=',i)



i= 12
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679594
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
merch,
Да, конечно, именно так.
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679600
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerДа, конечно, именно так.

Ты всерьёз не видишь разницу между его кодом и твоим?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679631
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE
  i INTEGER;
  FUNCTION INC RETURN INTEGER AS
  BEGIN
    i:=i+1;
    RETURN i;
  END; 
BEGIN
  i:= 5;
  i:= INC() + INC();
  DBMS_OUTPUT.PUT_LINE ('i = '|| i);
END;
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679640
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
j2k
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE
  i INTEGER;
  FUNCTION INC RETURN INTEGER AS
  BEGIN
    i:=i+1;
    RETURN i;
  END; 
BEGIN
  i:= 5;
  i:= INC() + INC();
  DBMS_OUTPUT.PUT_LINE ('i = '|| i);
END;



Это моветон и большой грех делать переопределение переменной в функциях (даже не передавая переменную), не учите людей (даже если им не симпатизируете) такому
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679660
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
j2k
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE
  i INTEGER;
  FUNCTION INC RETURN INTEGER AS
  BEGIN
    i:=i+1;
    RETURN i;
  END; 
BEGIN
  i:= 5;
  i:= INC() + INC();
  DBMS_OUTPUT.PUT_LINE ('i = '|| i);
END;

Я как-то декомпилировал индусский java-код. Мне он потом в кошмарах виделся. Боюсь, этот код гораздо страшнее...
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679661
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLЭто моветон
Поддерживаю.
Если очень надо реализовать внешний по отношению к функции контекст - переменную следует определить как in out или in out nocopy в параметрах функции.
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679669
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а смайлика никто и не заметил...
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679686
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
j2kа смайлика никто и не заметил...

Вы еще скажите что пальчики крестиком держали, когда такое на форум писали
Это как в Dual строк дописать или True и False взаимно переопределить, да и еще всякого добра наделать можно, при первых фразах о которых волосы встают дыбом даже на тех местах где и не знал что они есть. А Вы про смайлик ...
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679694
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLЭто как в Dual строк дописать
C 10-ки (в режиме OPEN) не актуально вроде как.
Ибо FAST DUAL плевать хотел на то, что вы в дуал поназапишете.
Хотя... :)
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679712
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXLили True и False взаимно переопределитьПрикольно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> declare                                                                                                                                                                                                                                                                                                                                                                                                                     true boolean  := standard.false;  false boolean := standard.true;
  2  begin
  3    dbms_output.put_line(case when true then 'true' else 'false' end);
  4  end;
  5  /
false

PL/SQL procedure successfully completed.
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679720
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousЕсли очень надо реализовать внешний по отношению к функции контекст - переменную следует определить как in out или in out nocopy в параметрах функции.кто ищет, тот грабли завсегда найдет
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare
   s varchar2(20);
   procedure incstr(x in out nocopy varchar2, n number, y varchar2) is
   begin
      for i in 1..n loop
         x := x || y;
      end loop;
   end;
begin
   s := 'A'; incstr(s, 3, s); dbms_output.put_line('A+3A='||s);
end;
/

A+3A=AAAAAAAA
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679725
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-кто ищет, тот грабли завсегда найдет
Ну не без этого, конечно.
IN всегда по ссылке, AFAIK:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> declare
  2    l_someVal varchar2(100);
  3    procedure p(i_param IN varchar2) is
  4    begin
  5      l_someVal := 'Не, оно по ссылке!';
  6      dbms_output.put_line(i_param);
  7    end;
  8  begin
  9    l_someVal := 'Копия?';
 10    p(l_someVal);
 11  end;
 12  /

Не, оно по ссылке!

PL/SQL procedure successfully completed

SQL> 
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679777
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
j2kа смайлика никто и не заметил... слава богу ))
...
Рейтинг: 0 / 0
Ну ладно бы 13 или 14....
    #39679821
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousIN всегда по ссылке, AFAIK
Фактический режим передачи IN OUT (byVal/byRef) - вроде сидит в голове, что вроде как отдан на откуп компилятору pl/sql, но воспроизвести ситуацию, когда оно пройдет по ссылке само, без NOCOPY что-то не особо получилось ни для встроенных, ни для объектных типов при любом уровне оптимизации от 0 до 3.

Кто помнит/знает - покажите плиз.

Я игрался так (от varchar через рекорд до объекта и таблицы объектов):

Код: 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.
alter session set PLSQL_OPTIMIZE_LEVEL = 3;
show parameter PLSQL_OPTIMIZE_LEVEL

drop type t1_t
/
drop type t1
/
create type t1 as object(v varchar2(100))
/
create type t1_t as table of t1
/

declare
  l_someVal t1_t := t1_t(t1('Копия'));
  procedure p( i_param IN t1_t
             , io_param IN OUT t1_t
             , ioNC_param in out NOCOPY t1_t
             ) is
  begin
--    l_someVal := t1_t(t1('Ссылка'));
    l_someVal(1) := t1('Ссылка');
    dbms_output.put_line('Режим IN: '||i_param(1).v);
    dbms_output.put_line('Режим IN OUT: '||io_param(1).v);
    dbms_output.put_line('Режим IN OUT NOCOPY: '||ionc_param(1).v);
  end;
begin
  p(l_someVal, l_someVal, l_someVal);
end;
/



с неизменным результатом вида
Код: plsql
1.
2.
3.
Режим IN: Ссылка
Режим IN OUT: Копия
Режим IN OUT NOCOPY: Ссылка
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ну ладно бы 13 или 14....
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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