powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не пойму логику in/out параметров процедуры
13 сообщений из 13, страница 1 из 1
Не пойму логику in/out параметров процедуры
    #39898644
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По первому взгляду вроде бы как все просто и однозначно.
Если IN — значит можно использовать справа от знака равенства. Если OUT — значит можно использовать слева от знака равенства. Если IN OUT — можно использовать в любом месте.
Но есть непонятные особенности.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
procedure proc1(p1 in varchar2, p2 out varchar2) is
begin
  p2 := null; --это понятно
  p2 := 'abc'; --это тоже понятно
  dbms_output.put_line('p2='||p2); --работает, хотя не должно
  p1 := 'zyx'; --выдает ошибку
end;
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898655
Фотография кит северных морей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Если IN — значит можно использовать справа от знака равенства. Если OUT — значит можно использовать слева от знака равенства. Если IN OUT — можно использовать в любом месте.

не так.

грубо говоря, внутри процедуры IN-параметр работает как константа (можно читать, нельзя изменять), OUT (+IN OUT) - как переменная (можно читать и изменять).

ну и помедитируйте над таким вызовом:
Код: plsql
1.
begin proc1('p1_val', 'p2_val'); end;



и таким:
Код: plsql
1.
begin proc1('p1_val'); end;
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898670
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Если OUT — значит можно использовать слева от знака равенства.
Формулировка неправильная.
А миф порождён ошибкой древней документации:7.3.4 https://docs.oracle.com/cd/A57673_01/DOC/server/doc/PLS23/ch7.htm#toc071 OUT Mode
An OUT parameter lets you return values to the caller of a subprogram. Inside the subprogram, an OUT parameter acts like an uninitialized variable . Therefore, its value cannot be assigned to another variable or reassigned to itself. For instance, the following assignment statement causes a compilation error:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
PROCEDURE calc_bonus (emp_id IN INTEGER, bonus OUT REAL) IS
   hire_date DATE;
BEGIN
   SELECT sal * 0.10, hiredate INTO bonus, hire_date FROM emp
      WHERE empno = emp_id;
   IF MONTHS_BETWEEN(SYSDATE, hire_date) > 60 THEN
      bonus := bonus + 500;  -- causes syntax error
   END IF;

Все страшилки - неправда:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> set serverout on
SQL> declare
  2    y int;
  3    procedure p(x out int)
  4    is
  5    begin
  6      x := nvl(x, 0) + 1;
  7    end p;
  8  begin
  9    p(y);
 10    dbms_output.put_line(y);
 11  end;
 12  /
1

PL/SQL procedure successfully completed.

SQL> disc
Disconnected from Oracle7 Server Release 7.3.4.0.0 - Production
With the distributed, replication and parallel query options
PL/SQL Release 2.3.4.0.0 - Production

Хотя зеленым всё сказано правильно. Но в современных версиях это простая правильная формулировка почему-то пропала.
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898714
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другими словами:
IN можно только читать, на входе в процедуру он сохраняет передаваемое в процедуру значение..
OUT можно использовать произвольно, но на входе в процедуру он равен NULL.
IN OUT можно использовать произвольно, на входе в процедуру он сохраняет передаваемое в процедуру значение.

Так?
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898722
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.

OUT можно использовать произвольно, но на входе в процедуру он равен NULL.

Надежнее рассматривать как неинициализированную переменную, не рассчитывая на null.

Alibek B.

IN OUT можно использовать произвольно, на входе в процедуру он сохраняет передаваемое в процедуру значение.

Рассматривайте как глобальную переменную, определенную в вызывающем коде.
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898730
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Рассматривайте как глобальную переменную, определенную в вызывающем коде.

Как бы наоборот, IN OUT по умолчанию передается по значению, а вот IN по ссылке))

Передача параметров в PL/SQL подпрограммы.
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898743
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev
andrey_anonymous
Рассматривайте как глобальную переменную, определенную в вызывающем коде.

Как бы наоборот, IN OUT по умолчанию передается по значению, а вот IN по ссылке))

Во-первых, оно сложнее с умолчаниями.
А во-вторых, в качестве первого приближения к правильному применению вполне годится.
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898758
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Другими словами:
Тебя нужно ткнуть в актуальную документацию, а сам найти нужное место и почитать не можешь?
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898760
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Alibek B.
OUT можно использовать произвольно, но на входе в процедуру он равен NULL.
Надежнее рассматривать как неинициализированную переменную, не рассчитывая на null.
Тем более, что есть типы, не поддерживающие концепцию null-а.
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898766
iOracleDev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Во-первых, оно сложнее с умолчаниями.

Ну да, как фишка ляжет))

andrey_anonymous
А во-вторых, в качестве первого приближения к правильному применению вполне годится.

Вот более близкое и понятное приближение PL-SQL-Use-IN-OUT-Parameter
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898790
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iOracleDev, - официальная документация почти всегда лучше

для 12.2 её более-менее привели в порядок - даже можно понять, почему
не работает
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
declare 
  r pls_integer;
  Procedure calc_bonus ( bonus out Simple_Integer -- causes runtime error
                       ) 
  Is   
  Begin
     bonus :=  500;  
  End;
begin
  calc_bonus( r);
end;



и даже в отношении out-параметров не забыто о :
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/plsql-subprograms.html#GUID-518B8827-26CC-4734-B799-ACB038185638 If the subprogram ends with an exception, then the value of the actual parameter is undefined.

Чему ранее посвящались самостоятельные образовательные статьи.
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39898989
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С передачей по ссылке/значению не поясните, правильно ли я понял?
В следующем примере:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
TYPE recService IS RECORD (
  mId               NUMBER,
  ...
);

PROCEDURE SERVICE_INFO(p_service NUMBER, rec_service OUT recService, res OUT recResultOut)
IS
...
select ... into rec_service from ...
...

svc recService;
svc.mId := 19969;
service_info(p_service=>svc.mId, rec_service=>svc, res=>res);


Насколько "безопасно" в качестве входного параметра передавать мембера выходного параметра?
Если IN передается по ссылке ( 22033371 ), то в прикладных языках программирования это было бы сомнительным местом, которое лучше на всякий случай переделать для исключения неопределенности.
Или по ссылке передается только IN OUT?
...
Рейтинг: 0 / 0
Не пойму логику in/out параметров процедуры
    #39899031
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Или по ссылке передается только IN OUT?
Да почитай же уже ты, чудак, документацию.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Не пойму логику in/out параметров процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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