powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ленивая инициализация
3 сообщений из 3, страница 1 из 1
Ленивая инициализация
    #39336362
Cheese)))
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь замутить что-то типа ленивой инициализации чтобы уйти от многочисленных вызовов одинаковых функций которые в свою очередь делают какой-то SQL. Но лыжы что-то не едут.
Написал такой пример:
Код: 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
create or replace type X1 as object
(
  attr_X integer,
  member function GetX return integer
)
/

create or replace type body X1 is
 
  member function GetX return integer is
  begin
    return attr_X;
  end;
  
end;
/

create or replace type Y1 as object
(
  obj_X X1,
  
  constructor function Y1 return self as result,
  
  member function GetObjX(SELF IN OUT NOCOPY Y1) return X1
)
/

create or replace type body Y1 is
 
  constructor function Y1 return self as result is
  begin
    return;
  end;

  member function GetObjX(SELF IN OUT NOCOPY Y1) return X1 is
  begin
    if obj_X is null then
      obj_X := X1(5); 
    end if;
    
    return obj_X;
  end;
  
end;
/

create or replace type Z1 as object
(
  obj_Y Y1,
  
  constructor function Z1 return self as result,
  
  member function GetObjY(SELF IN OUT NOCOPY Z1) return Y1
)
/

create or replace type body Z1 is
 
  constructor function Z1 return self as result is
  begin
    return;
  end;

  member function GetObjY(SELF IN OUT NOCOPY Z1) return Y1 is
  begin
    if obj_Y is null then
      obj_Y := Y1(); 
    end if;
    
    return obj_Y;
  end;
  
end;
/


declare
  y Y1;
  z Z1;
  i integer;
begin
  -- example 1
  y := Y1();
  i := y.GetObjX().GetX;  
  
  -- example 2
  z := Z1();
  i := z.GetObjY().GetObjX().GetX;
  
  dbms_output.put_line(to_char(i));
end;
/



Когда вложенность одноуровневая (в примере i := y.GetObjX().GetX; ), то так прокатывает.
А когда 2 и более, то получаю
PLS-00363: expression 'USER1.Z1.GETOBJY(Z)' cannot be used as an assignment target
Что не так сделал? Может можно как-то обойти и все же проинициализировать всю цепочку одной строкой?
...
Рейтинг: 0 / 0
Ленивая инициализация
    #39336452
Cheese))),

порядок "операций" задается скобками.
...
Рейтинг: 0 / 0
Ленивая инициализация
    #39336483
Cheese)))
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
резулт цацхеCheese))),

порядок "операций" задается скобками.

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


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