powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как обновить значение REF
10 сообщений из 10, страница 1 из 1
Как обновить значение REF
    #40023644
pumpk1n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеются такие таблицы и объекты. Инсерт работает, нужно теперь обновить значения для 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
Как обновить значение REF
    #40024762
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно наполнить коллекцию

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
Как обновить значение REF
    #40024971
pumpk1n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как обновить значение REF
    #40025819
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как обновить значение REF
    #40025925
pumpk1n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab,

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

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

Спасибо за то что помог разобраться, чуток вроде въехал.
Такой вопросик еще, эта же моя конструкция работает по принципу многие ко многим?
...
Рейтинг: 0 / 0
Как обновить значение REF
    #40026225
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как обновить значение REF
    #40026333
pumpk1n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab, я тогда немного не пойму, а как должна заполнятся эта таблица "класс", там же 2 коллекции со ссылками.
...
Рейтинг: 0 / 0
Как обновить значение REF
    #40026349
pumpk1n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как обновить значение REF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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