Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Инициализация сложной коллекции / 22 сообщений из 22, страница 1 из 1
02.08.2019, 11:26
    #39844512
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
Добрый день.
Чё оно не работает?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
declare 
  TYPE matrix_risk_obj IS RECORD (vector1 VARCHAR2(5), vector2 VARCHAR2(5), vector3 VARCHAR2(5), risk VARCHAR2(5)); 
  TYPE matrix_risk_tab IS TABLE OF matrix_risk_obj;
  v_a matrix_risk_tab := matrix_risk_tab(matrix_risk_obj('A', 'B' ,'C' , 'D'));
begin
  NULL;
end;



Код: plsql
1.
no fucntion with name 'matrix_risk_obj ' exists in this scope
...
Рейтинг: 0 / 0
02.08.2019, 11:31
    #39844517
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
IMNO,

А причем тут коллекция?
...
Рейтинг: 0 / 0
02.08.2019, 11:34
    #39844521
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
-2-, подразумевается, что matrix_risk_tab будет коллекция объектов matrix_risk_obj.
Я так понимаю, что у меня ошибка в терминологии, и Вы на это обращаете внимание)
В общем, мне надо, чтобы инициализация в примере заработала.
Только что попробовал, если типы объявлены на уровне базы, то всё работает.
...
Рейтинг: 0 / 0
02.08.2019, 13:14
    #39844606
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
...
Рейтинг: 0 / 0
02.08.2019, 15:15
    #39844670
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
IMNOЧё оно не работает?


У RECORD нет конструкторов. Посему:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare 
  TYPE matrix_risk_obj IS RECORD (vector1 VARCHAR2(5), vector2 VARCHAR2(5), vector3 VARCHAR2(5), risk VARCHAR2(5)); 
  TYPE matrix_risk_tab IS TABLE OF matrix_risk_obj;
  v_a matrix_risk_tab := matrix_risk_tab();
begin
  v_a.extend;
  v_a(1).vector1 := 'A';
  v_a(1).vector2 := 'B';
  v_a(1).vector3 := 'C';
  v_a(1).risk    := 'D';
end;
/



SY.
...
Рейтинг: 0 / 0
02.08.2019, 15:25
    #39844672
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SY
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare 
  TYPE matrix_risk_obj IS RECORD (vector1 VARCHAR2(5), vector2 VARCHAR2(5), vector3 VARCHAR2(5), risk VARCHAR2(5)); 
  TYPE matrix_risk_tab IS TABLE OF matrix_risk_obj;
  v_a matrix_risk_tab := matrix_risk_tab();
begin
  v_a.extend;
  v_a(1).vector1 := 'A';
  v_a(1).vector2 := 'B';
  v_a(1).vector3 := 'C';
  v_a(1).risk    := 'D';
end;
/


До кучи:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
  v_a.extend;
  select 'a','b','c','d'
   into v_a(2)
  from dual;

declare r_a  matrix_risk_obj;
begin
  r_a.a = 'a';
  v_a.extend;
  v_a(3) := r_a;
end;
...
...
Рейтинг: 0 / 0
02.08.2019, 15:25
    #39844673
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SYУ RECORD нет конструкторов.Ссылочку-таки почитай.
...
Рейтинг: 0 / 0
02.08.2019, 15:30
    #39844676
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
ElicSYУ RECORD нет конструкторов.Ссылочку-таки почитай.

OK. Уточню - до 18C у RECORD нет конструкторов.

SY.
...
Рейтинг: 0 / 0
02.08.2019, 15:32
    #39844680
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SYУточню"Исправлюсь"?
SYнетПравильнее говорить "не было".
...
Рейтинг: 0 / 0
02.08.2019, 15:35
    #39844686
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
ElicПравильнее говорить "не было".
Эээ... А что, с появлением 18с у record в предыдущих релизов конструкторы появились ?
...
Рейтинг: 0 / 0
02.08.2019, 16:03
    #39844694
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SYOK. Уточню - до 18C у RECORD нет конструкторов.Их и в 18с нет.
...
Рейтинг: 0 / 0
02.08.2019, 17:46
    #39844767
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
-2-Их и в 18с нет.

A constructor is a special method of a class or structure in object-oriented programming that initializes an object of that type. A constructor is an instance method that usually has the same name as the class, and can be used to set the values of the members of an object, either to default or to user-defined values.

Ну обозвали qualified expression. Обьясни в чем отличие от system defined constructor?

SY.
...
Рейтинг: 0 / 0
02.08.2019, 17:54
    #39844772
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SYв чем отличие от system defined constructor?В том, что переменная типа рекорд, в отличие от объектного, не может быть null. Конструировать нечего.ссылкаIn PL/SQL, we use the terms "qualified expression" and "aggregate" rather than the SQL term "type constructor"
...
Рейтинг: 0 / 0
04.08.2019, 14:46
    #39845084
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
-2-В том, что переменная типа рекорд, в отличие от объектного, не может быть null. Конструировать нечего.

Не хочу лезть в дебри философии, но разница в том что переменную объектного тип, как ты и сказал, можно отдельно сначала создать а затем отдельно инициировать с помощью либо системного либо одного из пользоватeльских конструкторов. А можно создать и инициировать "в одном флаконе":

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> CREATE OR REPLACE
  2    TYPE MATRIX_RISK_OBJ
  3      IS OBJECT(
  4                VECTOR1 VARCHAR2(5),
  5                VECTOR2 VARCHAR2(5),
  6                VECTOR3 VARCHAR2(5),
  7                RISK VARCHAR2(5)
  8               )
  9  /

Type created.

SQL> BEGIN
  2      DBMS_OUTPUT.PUT_LINE(MATRIX_RISK_OBJ('A','B','C','D').RISK);
  3  END;
  4  /
D

PL/SQL procedure successfully completed.



А с RECORD отдельно сначала создать а затем отдельно инициировать нельзя. RECORD всегда создается и инициируется "в одном флаконе". При декларации все атрибуты инициируются в NULL:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> DECLARE
  2      TYPE MATRIX_RISK_REC
  3        IS RECORD(
  4                  VECTOR1 VARCHAR2(5),
  5                  VECTOR2 VARCHAR2(5),
  6                  VECTOR3 VARCHAR2(5),
  7                  RISK VARCHAR2(5)
  8                 );
  9      V_REC MATRIX_RISK_REC;
 10  BEGIN
 11      DBMS_OUTPUT.PUT_LINE('RISK = "' || V_REC.RISK || '"');
 12      DBMS_OUTPUT.PUT_LINE('RISK = "' || MATRIX_RISK_REC().RISK || '"');
 13      DBMS_OUTPUT.PUT_LINE('RISK = "' || MATRIX_RISK_REC('A','B','C',NULL).RISK || '"');
 14  END;
 15  /
RISK = ""
RISK = ""
RISK = ""

PL/SQL procedure successfully completed.

SQL>



Так что, IMHO, конструктор есть в обоих случаях только с RECORD он применяется "в одном флаконе" с созданием.

SY.
...
Рейтинг: 0 / 0
04.08.2019, 15:18
    #39845093
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SYТак что, IMHO, конструктор есть в обоих случаях только с RECORD он применяется "в одном флаконе" с созданием.
Код: plsql
1.
select * into record/object ... ?
...
Рейтинг: 0 / 0
04.08.2019, 15:34
    #39845099
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
iOracleDev
Код: plsql
1.
select * into record/object ... ?



И что подразумевает сей ? Начнем с того чтo select * into object банально не катит. Катит select object_type(col1,...colN) into object_var который создает и инициирует временный обьект object_type(col1,...colN) а затем присваевает его object_var. А вот select * into record это просто для "меньше буковок" и банально означает select * into record.attribute1,...record.attributeN. Никакого RECORD тут не создается.

SY.
...
Рейтинг: 0 / 0
04.08.2019, 16:02
    #39845108
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SY,

В одном случае нам необходимо использовать конструктор объекта, в другом нет, в случае с записью все делается "под капотом", record не является объектом в pl/sql, мы не работаем с ним как с объектом.

"Никакого RECORD тут не создается." - фетч в коллекцию тоже не приводит к созданию, а чем тогда заполняется коллекция записей?
...
Рейтинг: 0 / 0
04.08.2019, 16:51
    #39845117
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
iOracleDevВ одном случае нам необходимо использовать конструктор объекта, в другом нет, в случае с записью все делается "под капотом", record не является объектом в pl/sql, мы не работаем с ним как с объектом.

"Никакого RECORD тут не создается." - фетч в коллекцию тоже не приводит к созданию, а чем тогда заполняется коллекция записей?

Ещё раз. Разницу между SELECT OBJECT_TYPE(col1,...colN) INTO OBJECT_VAR и SELECT col1,...colN INTO RECORD_VAR обьяснять не надо? В последнем record, как я и сказал, для "меньше буковок". A вот коллекция RECORD их и создает и инициализирует (конструктор) "в одном флаконе", причем делается это во всех версиях:

Код: 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.
SQL> SELECT  BANNER
  2    FROM  V$VERSION
  3  /

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for 64-bit Windows: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production

SQL> DECLARE
  2      TYPE MATRIX_RISK_REC
  3        IS RECORD(
  4                  VECTOR1 VARCHAR2(5),
  5                  VECTOR2 VARCHAR2(5),
  6                  VECTOR3 VARCHAR2(5),
  7                  RISK VARCHAR2(5)
  8                 );
  9      TYPE MATRIX_RISK_TAB
 10        IS TABLE OF MATRIX_RISK_REC;
 11      V_REC_TBL MATRIX_RISK_TAB;
 12  BEGIN
 13      SELECT  'A',
 14              'B',
 15              'C',
 16              'D'
 17        BULK  COLLECT
 18        INTO  V_REC_TBL
 19        FROM  DUAL;
 20  END;
 21  /

PL/SQL procedure successfully completed.

SQL> 



BULK COLLECT (остaвим оптимизацию в покое):

a) инициализирует коллекцию
б) extend коллекцию что "в одном флаконе" создает и инициализирует (конструктор) RECORD (все атрибуты инициализуются в NULL)
в) заполняет атрибуты RECORD

Иллюстрация б) в той-же 10G:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE
    TYPE MATRIX_RISK_REC
      IS RECORD(
                VECTOR1 VARCHAR2(5),
                VECTOR2 VARCHAR2(5),
                VECTOR3 VARCHAR2(5),
                RISK VARCHAR2(5)
               );
    TYPE MATRIX_RISK_TAB
      IS TABLE OF MATRIX_RISK_REC;
    V_REC_TBL MATRIX_RISK_TAB := MATRIX_RISK_TAB(); -- a) инициализирует коллекцию
BEGIN
    V_REC_TBL.EXTEND; -- б) extend коллекцию что "в одном флаконе" создает и инициализирует (конструктор) RECORD (все атрибуты инициализуются в NULL)
    DBMS_OUTPUT.PUT_LINE('RISK = "' || V_REC_TBL(1).RISK || '"');
END;
/
RISK = ""

PL/SQL procedure successfully completed.

SQL> 



Ещё раз - IMHO, конструктор есть в обоих случаях только с RECORD он применяется "в одном флаконе" с созданием.

SY.
...
Рейтинг: 0 / 0
04.08.2019, 16:52
    #39845118
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SYпеременную объектного тип, как ты и сказал, можно отдельно сначала создать а затем отдельно инициировать с помощью либо системного либо одного из пользоватeльских конструкторов. А можно создать и инициировать "в одном флаконеДля понимания, чем "создать" отличается от "инициировать", не хватает примера "создать и не инициировать".

SYконструктор есть в обоих случаяхЕсли синтаксический сахар, что вместо повторения переменной на каждое присвоение один раз пишется имя типа, есть конструктор. Тогда и у типа number есть безымянный "конструктор".
...
Рейтинг: 0 / 0
04.08.2019, 17:22
    #39845125
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
-2-Если синтаксический сахар, что вместо повторения переменной на каждое присвоение один раз пишется имя типа, есть конструктор. Тогда и у типа number есть безымянный "конструктор".

Я же сказал что INTO RECORD это для "меньше буковок". A вот COLLECTION(RECORD(VAL1,...)), IMHO, нет. Ну не вижу я разницы между MATRIX_RISK_REC(NULL,NULL,NULL,NULL) и MATRIX_RISK_OBJ(NULL,NULL,NULL,NULL). И тот и другой создает RECORD/OBJECT и присваивает каждому отдельному атрибуту указанное значение.

SY.
...
Рейтинг: 0 / 0
04.08.2019, 18:32
    #39845155
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
SY,

Разница простая record - не объект и работать с ним как с объектом нельзя.
...
Рейтинг: 0 / 0
04.08.2019, 18:49
    #39845164
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Инициализация сложной коллекции
iOracleDevРазница простая record - не объект и работать с ним как с объектом нельзя.

Речь шла о том чем qualified expression отличается от конструктора:

Starting with Oracle Database Release 18c, any PL/SQL value can be provided by an expression (for example for a record or for an associative array) like a constructor provides an abstract datatype value. In PL/SQL, we use the terms "qualified expression" and "aggregate" rather than the SQL term "type constructor", but the functionality is the same .

А то что record - не объект это и так понятно.

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


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