Reklama
Szukaj zleceń na Getak.pl

Stwórz profil

Musisz wpisać swoje imię
Musisz wpisać swoje nazwisko
Musisz wpisać poprawny e-mail
Musisz wpisać hasło (min. 8 znaków)
Musisz zaakceptować regulamin

Mariusz Śpiewakowski Administrator baz
danych - technolog,
Poczta Polska

Temat: Rozszerzenie wyczerpującego się pola o jedną cyfrę

Opis sytuacji:
Wyczerpujące się pole jednostkaid musimy rozszerzyć o jedną cyfrę.

create type tjednostka as object (
jednostkaid number(6),
jednostkanadrzedna ref tjednostka,
...
);

create table jednostka of tjednostka
( jednostkaid not null constraint pkjedn primary key using index,
jednostkanadrzedna not null constraint fkjedn references jednostka,
...
) object id primary key;
-- przykłady insertowania
insert into jednostka values( 1, make_ref( jednostka, 1 ) );
insert into jednostka values( 2, make_ref( jednostka, 1 ) );
...
insert into jednostka values( 999456, make_ref( jednostka, 23456 ) );
-- pole jednostkaid za chwilę się wyczerpie

Alterowanie typu, na którym oparta jest tablica przebiega bez zakłóceń.
Tablica widzi zmiany w polu jednostkaid. Inserty z rozszerzonym id przebiegają bez
zakłóceń.

-- ROZSZERZENIE POLA
alter type tjednostka modify attribute jednostkaid number(7)
cascade including table data;
-- nowa sesja
-- pole jednostkaid jest już number(7), a więc dodajemy jednostki ...
insert into jednostka values( 1000007, make_ref( jednostka, 123456 ) );
-- ten insert jest przyjęty, wydaje się że jest ok ...

Dzieje się tak, aż do momentu gdy w polu jednostkanadrzedna typu REF wskazującym na jednostkę
nadrzędną nie pojawi się odwołanie do rozszerzonego id. Zgłaszany jest wtedy błąd
ORA-01438: "wartość większa niż określona precyzja dozwolona dla tej kolumny".

insert into jednostka values( 1000008, make_ref( jednostka, 1000007 ) );
-- ten insert jest odrzucany, zwracany jest błąd:
-- "ORA-01438: wartość większa niż określona precyzja dozwolona dla tej kolumny".

Wygląda na to, że pole jednostkaid widzi dobrze rozszerzenie swojego atrybutu, ale referencja
do tego typu w jednostkanadrzedna, rozszerzenia swojego typu nie zauważyło.

Dodatkowe spostrzeżenia.
Gdy TOAD buduje skrypt dla typu tjednostka tworzy go z definicji pierwotnej
i listy alterów (lista zmian), co sugeruje, że definicja bieżąca jest wyliczana.
Wydaje się zatem, że w implementacji kontroli wprowadzanych danych
zapomniano o tym fakcie, ale to tylko gdybanie.

Jak wybrnąć z tego kłopotu nie przepisując tablicy ?
31.01.2012, 09:13

Paweł Grzegorz Kwiatkowski Senior Consultant,
Capgemini

Temat: Rozszerzenie wyczerpującego się pola o jedną cyfrę

Mariusz Śpiewakowski:
Opis sytuacji:
Wyczerpujące się pole jednostkaid musimy rozszerzyć o jedną cyfrę.

create type tjednostka as object (
jednostkaid number(6),
jednostkanadrzedna ref tjednostka,
...
);
...

Dzieje się tak, aż do momentu gdy w polu jednostkanadrzedna typu REF wskazującym na jednostkę
nadrzędną nie pojawi się odwołanie do rozszerzonego id. Zgłaszany jest wtedy błąd
ORA-01438: "wartość większa niż określona precyzja dozwolona dla tej kolumny".

insert into jednostka values( 1000008, make_ref( jednostka, 1000007 ) );
-- ten insert jest odrzucany, zwracany jest błąd:
-- "ORA-01438: wartość większa niż określona precyzja dozwolona dla tej kolumny".

Zdaje się, że w definicji typu TJEDNOSTKA jest NUMBER(6), a nie NUMBER(7). Należałoby zmodyfikować definicję typu TJEDNOSTKA.

alter type TJEDNOSTKA modify attribute (<nazwa atrybutu> number(7));
31.01.2012, 09:57

Mariusz Śpiewakowski Administrator baz
danych - technolog,
Poczta Polska

Temat: Rozszerzenie wyczerpującego się pola o jedną cyfrę

No "niby" alter jest poprawnie przeprowadzany:

alter type tjednostka modify attribute jednostkaid number(7)
cascade including table data;

Czy może o czymś innym mowa? ...dzięki za odpowiedź
31.01.2012, 10:42

Paweł Grzegorz Kwiatkowski Senior Consultant,
Capgemini

Temat: Rozszerzenie wyczerpującego się pola o jedną cyfrę

Mój błąd, przeoczyłem modyfikacje typu w oryginalnym poście :)
31.01.2012, 11:03



Wyślij zaproszenie do