Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Ленивая инициализация / 3 сообщений из 3, страница 1 из 1
28.10.2016, 15:15
    #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
28.10.2016, 15:55
    #39336452
Ленивая инициализация
Cheese))),

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

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

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


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