Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как обновить значение REF / 10 сообщений из 10, страница 1 из 1
01.12.2020, 14:45
    #40023644
pumpk1n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
Имеются такие таблицы и объекты. Инсерт работает, нужно теперь обновить значения для T_STUDENTI. Но не могу понять как.

Код: 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.
CREATE OR REPLACE TYPE STUDENTI AS OBJECT(
    S_NUM   INT,
    S_UZV   VARCHAR2(30)
);

CREATE OR REPLACE TYPE PASNIEDZEJI AS OBJECT(
    P_NUM   INT,
    P_UZV   VARCHAR2(30)
);

CREATE OR REPLACE TYPE ATS_ST AS OBJECT(
    ID  INT,
    ST_ID REF STUDENTI
);

CREATE OR REPLACE TYPE ATS_PN AS OBJECT(
    ID  INT,
    PN_ID REF PASNIEDZEJI
);

CREATE OR REPLACE TYPE ATS_P AS TABLE OF ATS_PN;
CREATE OR REPLACE TYPE ATS_S AS TABLE OF ATS_ST;

CREATE OR REPLACE TYPE O_STUDENTI AS OBJECT(
    STUD STUDENTI,
    PASN ATS_P
);

CREATE OR REPLACE TYPE O_PASNIEDZEJI AS OBJECT(
    PASN PASNIEDZEJI,
    STUD ATS_S
);

CREATE TABLE T_STUDENTI OF O_STUDENTI
NESTED TABLE PASN STORE AS P_TBL;

CREATE TABLE T_PASNIEDZEJI OF O_PASNIEDZEJI
NESTED TABLE STUD STORE AS S_TBL;

INSERT INTO T_STUDENTI VALUES (STUDENTI(191, 'KOMAROVS'), NULL);

INSERT INTO T_PASNIEDZEJI VALUES (PASNIEDZEJI(53, 'GUSEVS'), NULL);
INSERT INTO T_PASNIEDZEJI VALUES (PASNIEDZEJI(54, 'HIKAEVS'), NULL);




Код: plsql
1.
UPDATE T_STUDENTI A SET A.PASN.P_NUM = (SELECT REF(A) FROM T_PASNIEDZEJI A WHERE a.pasn.P_NUM = 53) WHERE A.stud.S_NUM = 191;



Ошибка:

автор"A"."PASN"."P_NUM": недопустимый идентификатор
...
Рейтинг: 0 / 0
04.12.2020, 21:36
    #40024762
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
Можно наполнить коллекцию

UPDATE T_STUDENTI A SET A.PASN =


Для этого нужно сконструировать таблицу ATS_P объектов ATS_PN (
ID INT,
PN_ID REF PASNIEDZEJI
)
.

Т.е. REF(A) должна занимать место PN_ID в конструкторе ATS_PN:

SELECT ATS_PN (NULL, REF(A)) FROM T_PASNIEDZEJI A
...
Рейтинг: 0 / 0
05.12.2020, 23:41
    #40024971
pumpk1n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
mcureenab,

выполнил такую команду (если я тебя правильно понял)


Код: plsql
1.
UPDATE T_STUDENTI A SET A.PASN = ATS_PN(1, (SELECT REF(A) FROM T_PASNIEDZEJI A WHERE a.pasn.P_NUM = 53)) WHERE A.stud.S_NUM = 191;



Получил такую ошибку:

авторSQL Error: ORA-00932: несовместимые типы данных: ожидается -, получено USER.ATS_PN
00932. 00000 - "inconsistent datatypes: expected %s got %s"

Попробовал еще так:

Код: plsql
1.
UPDATE T_STUDENTI A SET A.PASN = ATS_P(ATS_PN(1, (SELECT REF(A) FROM T_PASNIEDZEJI A WHERE a.pasn.P_NUM = 53))) WHERE A.stud.S_NUM = 191;



Тут ошибка уже:

авторSQL Error: ORA-00932: несовместимые типы данных: ожидается REF USER.PASNIEDZEJI, получено REF USER.O_PASNIEDZEJI
00932. 00000 - "inconsistent datatypes: expected %s got %s"
...
Рейтинг: 0 / 0
08.12.2020, 23:50
    #40025819
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
pumpk1n
mcureenab,

Попробовал еще так:

Код: plsql
1.
UPDATE T_STUDENTI A SET A.PASN = ATS_P(ATS_PN(1, (SELECT REF(A) FROM T_PASNIEDZEJI A WHERE a.pasn.P_NUM = 53))) WHERE A.stud.S_NUM = 191;



Тут ошибка уже:

авторSQL Error: ORA-00932: несовместимые типы данных: ожидается REF USER.PASNIEDZEJI, получено REF USER.O_PASNIEDZEJI
00932. 00000 - "inconsistent datatypes: expected %s got %s"



T_PASNIEDZEJI A это O_PASNIEDZEJI

Второй атрибут ATS_PN это PN_ID REF PASNIEDZEJI.

Тип PASNIEDZEJI имеет O_PASNIEDZEJI.PASN PASNIEDZEJI

T_PASNIEDZEJI A -> O_PASNIEDZEJI -> O_PASNIEDZEJI.PASN -> PASNIEDZEJI -(REF)> >>> ATS_PN.PN_ID -> REF PASNIEDZEJI

Вроде так получается:

Код: plsql
1.
UPDATE T_STUDENTI A SET A.PASN = ATS_P(ATS_PN(1, (SELECT REF(A.PASN) FROM T_PASNIEDZEJI A WHERE a.pasn.P_NUM = 53))) WHERE A.stud.S_NUM = 191;
...
Рейтинг: 0 / 0
09.12.2020, 13:44
    #40025925
pumpk1n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
mcureenab,

Попробовал, и что значит это, я не понимаю -_-

авторSQL Error: ORA-00904: "A"."PASN": недопустимый идентификатор
00904. 00000 - "%s: invalid identifier"
...
Рейтинг: 0 / 0
09.12.2020, 23:36
    #40026176
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
pumpk1n
mcureenab,

Попробовал, и что значит это, я не понимаю -_-

авторSQL Error: ORA-00904: "A"."PASN": недопустимый идентификатор
00904. 00000 - "%s: invalid identifier"


Да. Ступил. REF к атрибутам не применим. У атрибута нет своего OID.

В твоей БД нет таблиц с объектами STUDENTI или PASNIEDZEJI, так что атрибуты типа REF STUDENTI или REF PASNIEDZEJI не имеют в ней смысла. Им нет на что ссылаться.

Вот так работает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE T_TSTUDENTI OF STUDENTI;
CREATE TABLE T_TPASNIEDZEJI OF PASNIEDZEJI;
INSERT INTO T_TSTUDENTI VALUES (STUDENTI(291, 'КОМАРОВ'));
INSERT INTO T_TPASNIEDZEJI VALUES (PASNIEDZEJI(253, 'ГУСЕВ'));

-- KOMAROVS -> [REF ГУСЕВ]
UPDATE T_STUDENTI A SET A.PASN = ATS_P(ATS_PN(1, (SELECT REF(A) FROM T_TPASNIEDZEJI A WHERE a.P_NUM = 253))) WHERE A.stud.S_NUM = 191;

-- HIKAEVS -> [REF КОМАРОВ]
UPDATE T_PASNIEDZEJI A SET A.STUD = ATS_S(ATS_ST(2, (SELECT REF(A) FROM T_TSTUDENTI A WHERE A.S_NUM = 291))) WHERE A.PASN.P_NUM = 54;
...
Рейтинг: 0 / 0
10.12.2020, 00:41
    #40026191
pumpk1n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
mcureenab,

Спасибо за то что помог разобраться, чуток вроде въехал.
Такой вопросик еще, эта же моя конструкция работает по принципу многие ко многим?
...
Рейтинг: 0 / 0
10.12.2020, 03:09
    #40026225
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
pumpk1n
mcureenab,

Такой вопросик еще, эта же моя конструкция работает по принципу многие ко многим?


В явном виде такой ассоциации у тебя нет.

Есть две ассоциации 1 -> *

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE TYPE O_STUDENTI AS OBJECT(
    STUD STUDENTI, -- один
    PASN ATS_P -- много (коллекция)
);

CREATE OR REPLACE TYPE O_PASNIEDZEJI AS OBJECT(
    PASN PASNIEDZEJI, -- один
    STUD ATS_S -- много (коллекция)
);



В таблицах
TABLE T_STUDENTI OF O_STUDENTI;
TABLE T_PASNIEDZEJI OF O_PASNIEDZEJI;
атрибуты STUD и PASN "размножаются". Неявно получаются два экземпляра ассоциаций * - *, это вся таблица T_STUDENTI и вся таблица T_PASNIEDZEJI. Но обычно, если говорят об ассоциации объектов, полагают, что в информационной системе их можно будет создавать не меняя схему БД. В твоей схеме БД связать учеников и учителей как-то ещё нельзя.

Для иллюстрации...

Можно, создать ассоциацию O_КЛАСС, в котором числятся ученики с одной стороны, и с которым работают учителя с другой стороны.

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE OR REPLACE TYPE O_КЛАСС AS OBJECT(
    К_NUM NUMBER, -- номер класса (параллель)
    К_ЛИТЕР CHAR(1), -- буква класса
    STUD ATS_S, -- много (коллекция REF)
    PASN ATS_P -- много (коллекция REF)
);



В таблице
TABLE T_КЛАСС OF O_КЛАСС
можно хранить сколько угодно экземпляров ассоциации * - *. Добавлять классы можно не меняя схему БД.
...
Рейтинг: 0 / 0
10.12.2020, 13:09
    #40026333
pumpk1n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
mcureenab, я тогда немного не пойму, а как должна заполнятся эта таблица "класс", там же 2 коллекции со ссылками.
...
Рейтинг: 0 / 0
10.12.2020, 13:47
    #40026349
pumpk1n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как обновить значение REF
mcureenab,

В общем сделал так:

Код: 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.
CREATE OR REPLACE TYPE STUDENTI AS OBJECT(
    S_NUM   INT,
    S_UZV   VARCHAR2(30)
);

CREATE OR REPLACE TYPE PASNIEDZEJI AS OBJECT(
    P_NUM   INT,
    P_UZV   VARCHAR2(30)
);

CREATE OR REPLACE TYPE ATS_ST AS OBJECT(
    ID  INT,
    ST_ID REF STUDENTI
);

CREATE OR REPLACE TYPE ATS_PN AS OBJECT(
    ID  INT,
    PN_ID REF PASNIEDZEJI
);

CREATE OR REPLACE TYPE ATS_P AS TABLE OF ATS_PN;
CREATE OR REPLACE TYPE ATS_S AS TABLE OF ATS_ST;

CREATE TABLE T_STUDENTI OF STUDENTI;

CREATE TABLE T_PASNIEDZEJI OF PASNIEDZEJI;

CREATE OR REPLACE TYPE O_CLASS AS OBJECT(
    K_NUM NUMBER, -- номер класса (параллель)
    K_APZ CHAR(1), -- буква класса
    STUD ATS_S, -- много (коллекция REF)
    PASN ATS_P -- много (коллекция REF)
);

CREATE TABLE T_CLASS OF O_CLASS
NESTED TABLE STUD STORE AS C1
NESTED TABLE PASN STORE AS C2;

INSERT INTO T_STUDENTI VALUES (191, 'GUSEVS');

INSERT INTO T_PASNIEDZEJI VALUES (14, 'JAUNCIEMS');
INSERT INTO T_PASNIEDZEJI VALUES (15, 'JANUKS');

INSERT INTO T_CLASS VALUES (1, 'S', ATS_S(ATS_ST(1, (SELECT REF(A) FROM T_STUDENTI A WHERE A.S_NUM = 191))), NULL);

UPDATE T_CLASS A SET A.PASN = ATS_P(ATS_PN(1, (SELECT REF(A) FROM T_PASNIEDZEJI A WHERE A.P_NUM = 14)), ATS_PN(2, (SELECT REF(A) FROM T_PASNIEDZEJI A WHERE A.P_NUM = 15)));



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


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