Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ну ладно бы 13 или 14.... / 25 сообщений из 28, страница 1 из 2
26.07.2018, 11:16
    #39679482
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
Код: 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
26.07.2018, 11:23
    #39679486
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
XMLer...
получили 12

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

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

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

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

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

При Вашем написании переменная i еказывает на ячейку памяти со значением 5 вплоть до того пока ее не переопределят в 12.
...
Рейтинг: 0 / 0
26.07.2018, 11:33
    #39679499
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
26.07.2018, 11:35
    #39679502
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
XMLerЭто как то закреплено докой?RTFM Subprogram Parameter Passing Methods (FAQ)
...
Рейтинг: 0 / 0
26.07.2018, 11:38
    #39679505
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
XMLerпротиворечит результатам в подавляющем большинстве языков.Возможно твое личное большинство тебя подавляет как-то особенным образом.
...
Рейтинг: 0 / 0
26.07.2018, 12:20
    #39679537
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
26.07.2018, 12:36
    #39679559
Alexander Ryndin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
26.07.2018, 12:42
    #39679568
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
26.07.2018, 13:11
    #39679594
XMLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
merch,
Да, конечно, именно так.
...
Рейтинг: 0 / 0
26.07.2018, 13:17
    #39679600
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
XMLerДа, конечно, именно так.

Ты всерьёз не видишь разницу между его кодом и твоим?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.07.2018, 14:07
    #39679631
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
Код: 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
26.07.2018, 14:26
    #39679640
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
26.07.2018, 14:42
    #39679660
Alexander Ryndin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
26.07.2018, 14:42
    #39679661
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
MaximaXXLЭто моветон
Поддерживаю.
Если очень надо реализовать внешний по отношению к функции контекст - переменную следует определить как in out или in out nocopy в параметрах функции.
...
Рейтинг: 0 / 0
26.07.2018, 14:49
    #39679669
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
а смайлика никто и не заметил...
...
Рейтинг: 0 / 0
26.07.2018, 15:01
    #39679686
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
j2kа смайлика никто и не заметил...

Вы еще скажите что пальчики крестиком держали, когда такое на форум писали
Это как в Dual строк дописать или True и False взаимно переопределить, да и еще всякого добра наделать можно, при первых фразах о которых волосы встают дыбом даже на тех местах где и не знал что они есть. А Вы про смайлик ...
...
Рейтинг: 0 / 0
26.07.2018, 15:12
    #39679694
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
MaximaXXLЭто как в Dual строк дописать
C 10-ки (в режиме OPEN) не актуально вроде как.
Ибо FAST DUAL плевать хотел на то, что вы в дуал поназапишете.
Хотя... :)
...
Рейтинг: 0 / 0
26.07.2018, 15:31
    #39679712
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
26.07.2018, 15:43
    #39679720
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
26.07.2018, 15:52
    #39679725
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
-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
26.07.2018, 17:16
    #39679777
Alexander Ryndin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
j2kа смайлика никто и не заметил... слава богу ))
...
Рейтинг: 0 / 0
26.07.2018, 18:39
    #39679821
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ну ладно бы 13 или 14....
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ну ладно бы 13 или 14.... / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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