Błędy SQL DEVELOPERA przy tworzeniu generatora danych

Odpowiedz Nowy wątek
2018-12-15 12:04
0

WItam,

Stworzyłem bardzo "upośledzony" generator danych losowych w SQL DEVELOPER. np. dla tabeli

create table klient( 
ID_klienta INTEGER primary key, 
imie varchar2(15), 
nazwisko varchar2(15),
ulica varchar2(30),
miejscowosc varchar2(30),
pesel varchar2(11), 
mail varchar2(30), 
telefon_kontaktowy varchar2(20), 
uwagi varchar2(100) 
);

mam kodzik

BEGIN  
FOR loop_counter IN 1..1000 LOOP 
INSERT INTO "KLIENT" (ID_KLIENTA, IMIE, NAZWISKO, ULICA, miejscowosc, PESEL, mail, telefon_kontaktowy, uwagi) 
VALUES (loop_counter, dbms_random.value(1,1000),dbms_random.value(1,1000),dbms_random.value(1,1000),dbms_random.value(1,1000),dbms_random.value(11111111111,9999999999),dbms_random.value(11111111111,9999999999)+'@gmail.com', dbms_random.value(555555555,799999999),'opis' 
       ); 
END LOOP; 
COMMIT; 
END;

A SQL DEVELOPER wyrzuca błąd
Error report -
ORA-12899: wartość zbyt duża dla kolumny "S91405"."KLIENT1"."IMIE" (obecna: 40, maksymalna: 15)
ORA-06512: przy linia 3

  1. 00000 - "value too large for column %s (actual: %s, maximum: %s)"
    Cause: An attempt was made to insert or update a column with a value
    which is too wide for the width of the destination column.
    The name of the column is given, along with the actual width
    of the value, and the maximum allowed width of the column.
    Note that widths are reported in characters if character length
    semantics are in effect for the column, otherwise widths are
    reported in bytes.
    Action: Examine the SQL statement for correctness. Check source
    and destination column data types.
    Either make the destination column wider, or use a subset
    of the source column (i.e. use substring).

Zwiększyłem więc limity z do 40 i dostaję bład
Error report -
ORA-01536: przekroczenie limitu w przestrzeni tabel 'STUDTBS1'
ORA-06512: przy linia 3

  1. 00000 - "space quota exceeded for tablespace '%s'"
    Cause: The space quota for the segment owner in the tablespace has
    been exhausted and the operation attempted the creation of a
    new segment extent in the tablespace.
    Action: Either drop unnecessary objects in the tablespace to reclaim
    space or have a privileged user increase the quota on this
    tablespace for the segment owner.

Przy tabeli PRACOWNIK

create table pracownik( 
ID_pracownika INTEGER primary key, 
imie varchar2(50),
nazwisko varchar2(50), 
stanowisko varchar2(15), 
pesel varchar2(11), 
ulica varchar2(30),
miejscowosc varchar2(30),
mail varchar2(30),
telefon_kontaktowy varchar(15), 
pensja varchar2(10),
data_zatrudnienia date 
);

i kodzie

BEGIN  
FOR loop_counter IN 1..1000 LOOP 
INSERT INTO "PRACOWNIK" (id_pracownika, imie, nazwisko, stanowisko, pesel, ulica, miejscowosc, mail, telefon_kontaktowy, pensja, data_zatrudnienia) 
VALUES (loop_counter, DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000), DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J') ,TO_CHAR(DATE '9999-12-31','J'))
       ); 
END LOOP; 
COMMIT; 
END;

Dostaję za to taki błąd

Error report -
ORA-06550: linia 4, kolumna 704:
PL/SQL: ORA-00932: niespójne typy danych: oczekiwano DATE, uzyskano NUMBER
ORA-06550: linia 3, kolumna 1:
PL/SQL: SQL Statement ignored

  1. 00000 - "line %s, column %s:\n%s"
    Cause: Usually a PL/SQL compilation error.
    Action:

I o ile to zrozumiałem i sprawdziłem to wg mnie DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J') ,TO_CHAR(DATE '9999-12-31','J')) dodaje wartość DATE która jest zadeklarowana a program twierdzi inaczej...

Czy ktoś może mnie nakierować jak to naprawić?

edytowany 4x, ostatnio: cross099, 2018-12-15 12:08

Pozostało 580 znaków

2018-12-15 13:34
0

no ale czego nie rozumiesz? Przecież tam dokładnie pisze co jest nie tak. Masz ograniczoną przestrzeń do wykorzystania STUDTBS1 - jeśli to Twoja maszyna to możesz sobie zwiększyć (potrzeba dostępu admina do bazy) jeśli nie twoja to musisz się uśmiechnąć do kogoś, kto nią zarządza.
RANDOM.VALUE zwraca numer nie datę. Jak chcesz mieć datę to możesz zrobić np. tak To_date('1', 'J') + DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J') ,TO_CHAR(DATE '9999-12-31','J'))


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2018-12-15 17:58
0

Ja bym jeszcze dodała że to w żadnym wypadku nie są błędy SQL Developera tylko i wyłącznie Twoje błędy. Poza tym w oracle typ na pk lepiej wziąć number a nie integer.

Czemu PK jako numeric a nie integer? Jaki ma sens klucz na typie zmiennoprzecinkowym?:) - ukasz112 2018-12-15 19:20
@ukasz112: Spójrz sobie na zakresy inta i numbera. - kate87 2018-12-15 20:55
Spojrzałem i nie czuję się przekonany. Jak planujesz przekroczyć zakres to używasz BIGINTa. Ja pracuję na MS więc chciałbym zrozumieć czemu w Oracle robi się inaczej i z czego to może wynikać. - ukasz112 2018-12-16 10:01

Pozostało 580 znaków

2018-12-15 19:15
0

Jestem tego świadom że to moje błędy. Bardzo chętnie bym je naprawił.

Właśnie tam gdzie jest iteger miałem number (2,0) ale prowadzący stwierdził że lepszy jest integer i dlatego zmieniłem na INT.

Sprawdziłem i zmieniłem na coś w typie

FOR loop_counter IN 1..1000 LOOP 
INSERT INTO "PRACOWNIK" (id_pracownika, imie, nazwisko, stanowisko, pesel, ulica, miejscowosc, mail, telefon_kontaktowy, pensja, data_zatrudnienia) 
VALUES (loop_counter, DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000), DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.VALUE(To_date('1', 'J') + DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J') ,TO_CHAR(DATE '9999-12-31','J'))
       ); 
END LOOP; 
COMMIT; 
END;

I dostałem

Error report -
ORA-06550: linia 4, kolumna 704:
PLS-00306: niepoprawna liczba lub typy argumentów w wywołaniu "VALUE"
ORA-06550: linia 4, kolumna 692:
PL/SQL: ORA-00904: "DBMS_RANDOM"."VALUE": niepoprawny identyfikator
ORA-06550: linia 3, kolumna 1:
PL/SQL: SQL Statement ignored

  1. 00000 - "line %s, column %s:\n%s"
    Cause: Usually a PL/SQL compilation error.
    Action:

Ale tak myślę. Skoro mam kod:


BEGIN  
FOR loop_counter IN 1..10 LOOP 
INSERT INTO "SAMOCHOD" (id_samochodu, marka, n_model, pojemnosc_silnika, VIN, id_klienta) 
VALUES (loop_counter, dbms_random.value(1,10),dbms_random.value(1,10),dbms_random.value(1,10),dbms_random.value(1,10), dbms_random.value(1,10)
       ); 
END LOOP; 
COMMIT; 
END;

I dostaję

Error report -
ORA-12899: wartość zbyt duża dla kolumny "S91405"."SAMOCHOD"."MARKA" (obecna: 40, maksymalna: 30)
ORA-06512: przy linia 3

  1. 00000 - "value too large for column %s (actual: %s, maximum: %s)"
    Cause: An attempt was made to insert or update a column with a value
    which is too wide for the width of the destination column.
    The name of the column is given, along with the actual width
    of the value, and the maximum allowed width of the column.
    Note that widths are reported in characters if character length
    semantics are in effect for the column, otherwise widths are
    reported in bytes.
    Action: Examine the SQL statement for correctness. Check source
    and destination column data types.
    Either make the destination column wider, or use a subset
    of the source column (i.e. use substring).
    To jak mogę zmniejszyć jeszcze tą wartość? Bo wiem że mogę powiększyć do tych 40 ale wtedy mi się baza nie mieści w założonych ramach.
edytowany 1x, ostatnio: cross099, 2018-12-15 19:16

Pozostało 580 znaków

2018-12-15 21:09
0

Dobra wrzuć to na jakieś sqlfiddle. Powinno dać się poprawić.

Pozostało 580 znaków

2018-12-16 12:21
0
create table pracownik( 
ID_pracownika number(3,0) primary key, 
imie varchar2(15) not null, 
nazwisko varchar2(15) not null, 
stanowisko varchar2(15) not null, 
pesel number(11,0) not null, 
ulica varchar2(30) not null,
miejscowosc varchar2(30) not null,
mail varchar2(30),
telefon_kontaktowy varchar(15) not null, 
pensja number(6,0),
data_zatrudnienia date 
);
create table klient( 
ID_klienta integer primary key, 
imie varchar2(40), 
nazwisko varchar2(40),
ulica varchar2(40),
miejscowosc varchar2(40),
pesel varchar2 (40), 
mail varchar2(40), 
telefon_kontaktowy varchar2(40), 
uwagi varchar2(40) 
);
create table samochod1( 
ID_samochodu number (10) primary key, 
marka varchar2(30),
n_model varchar2(30),
pojemnosc_silnika number(4,0), 
VIN varchar2(18) not null,
ID_klienta number(10,0),
);
ACCEPT iterator NUMBER PROMPT 'Wpisz liczbe wierszy do wstawienia w tabeli';
BEGIN  
FOR loop_counter IN 1..&iterator 
LOOP 
INSERT INTO "KLIENT3" (ID_KLIENTA, IMIE, NAZWISKO, ULICA, miejscowosc, PESEL, mail, telefon_kontaktowy, uwagi) 
VALUES (loop_counter, dbms_random.value(1,1000),dbms_random.value(1,1000),dbms_random.value(1,1000),dbms_random.value(1,1000),dbms_random.value(11111111111,9999999999),dbms_random.value(11111111111,9999999999)+'@gmail.com', dbms_random.value(555555555,799999999),'opis' 
       ); 
END LOOP; 
COMMIT; 
END;
ACCEPT iterator NUMBER PROMPT 'Wpisz liczbe wierszy do wstawienia w tabeli';
BEGIN  
FOR loop_counter IN 1..&iterator 
LOOP 
INSERT INTO "SAMOCHOD1" (id_samochodu, marka, n_model, pojemnosc_silnika, VIN, id_klienta) 
VALUES (loop_counter, dbms_random.value(1,1000),dbms_random.value(1,1000),dbms_random.value(1,1000),dbms_random.value(1,1000), dbms_random.value(1,1000)
       ); 
END LOOP; 
COMMIT; 
END;
ACCEPT iterator NUMBER PROMPT 'Wpisz liczbe wierszy do wstawienia w tabeli';
BEGIN  
FOR loop_counter IN 1..&iterator 
LOOP 
INSERT INTO "PRACOWNIK" (id_pracownika, imie, nazwisko, stanowisko, pesel, ulica, miejscowosc, mail, telefon_kontaktowy, pensja, data_zatrudnienia) 
VALUES (loop_counter, DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000), DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.value(1,1000),DBMS_RANDOM.VALUE(To_date('1', 'J') + DBMS_RANDOM.VALUE(TO_CHAR(DATE '2000-01-01','J') ,TO_CHAR(DATE '9999-12-31','J'))
       )); 
END LOOP; 
COMMIT; 
END;

-- Tak miałem na początku ale z taką sytuacją już w ogóle nie mogłem sobie dać rady --

create table pracownik( 
ID_pracownika number(3,0) primary key, 
imie varchar2(15) not null, 
nazwisko varchar2(15) not null, 
stanowisko varchar2(15) not null, 
pesel number(11,0) not null, 
ulica varchar2(30) not null,
miejscowosc varchar2(30) not null,
mail varchar2(30),
telefon_kontaktowy varchar(15) not null, 
pensja number(6,0),
data_zatrudnienia date 
);
create table klient( 
ID_klienta number(10,0) primary key, 
imie varchar2(15) not null, 
nazwisko varchar2(15) not null,
ulica varchar2(30) not null,
miejscowosc varchar2(30) not null,
pesel number (11,0) not null, 
mail varchar2(30), 
telefon_kontaktowy number(20,0) not null, 
uwagi varchar2(100) 
);
create table samochod( 
ID_samochodu number (10) primary key, 
marka varchar2(30),
constraint fk_samochod_marka Foreign key(marka) REFERENCES marka,
n_model varchar2(30),
constraint fk_samochod_model Foreign key(n_model) REFERENCES n_model,
pojemnosc_silnika number(4,0) not null, 
VIN varchar2(18) not null,
ID_klienta number(10,0),
constraint fk_samochod_klient Foreign key(ID_klienta) REFERENCES klient
);
create table wykaz_czynnosci( 
ID_czynnosci number(3,0) primary key, 
nazwa_czynnosci varchar2(25) not null, 
opis_czynnosci varchar2(100) 
);

create table wizyta( 
ID_wizyty number(4,0) primary key, 
id_czynnosci number(3,0),
constraint fk_wizyta_czynnosc Foreign key(ID_czynnosci) REFERENCES wykaz_czynnosci,
ID_samochodu number (10),
constraint fk_wizyta_samochod Foreign key(ID_samochodu) REFERENCES samochod,
ID_pracownika number(3,0),
constraint fk_wizyta_pracownik Foreign key(ID_pracownika) REFERENCES pracownicy
);

create table marka( 
id_marka varchar2(30) primary key,
nazwa varchar2(30)
);

create table n_model( 
id_model varchar2(30) primary key, 
nazwa varchar2(30)
id_marka varchar2(30)
);

create sequence seqklient
minvalue 1
maxvalue 9999
start with 1
increment by 1

create sequence seqpracownik

minvalue 1
maxvalue 9999
start with 1
increment by 1

create sequence seqwykazczynnosci
minvalue 1
maxvalue 9999
start with 1
increment by 1

create sequence seqwizyta
minvalue 1
maxvalue 9999
start with 1
increment by 1
edytowany 1x, ostatnio: cross099, 2018-12-16 12:22
http://sqlfiddle.com/ tutaj spreparuj swoją bazę i pokaż jakimi błędami rzuca - kate87 2018-12-16 21:27

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0