Witam,
Mam pewien problem z bazą, otóż do 3 stworzonych tabeli trzeba napisać generator, który będzie generował realne dane.
CREATE TABLE AUTOR
(
AUT_ID_AUTOR NUMBER,
AUT_IMIE VARCHAR2(19),
AUT_NAZWISKO VARCHAR(20)
);
ALTER TABLE AUTOR
ADD CONSTRAINT AUTOR_PK PRIMARY KEY
(
AUT_ID_AUTOR
);
----------------------------------------------------------
CREATE TABLE GATUNEK
(
GAT_ID_GATUNEK NUMBER,
GAT_GATUNEK VARCHAR2(45)
);
ALTER TABLE GATUNEK
ADD CONSTRAINT GATUNEK_PK PRIMARY KEY
(
GAT_ID_GATUNEK
);
----------------------------------------------------------------
CREATE TABLE KSIAZKA
(
KSI_ID_KSIAZKA NUMBER,
KSI_ID_GATUNEK NUMBER,
KSI_ID_AUTOR NUMBER,
KSI_TYTUL VARCHAR2(65),
KSI_ROK_WYDANIA NUMBER,
KSI_NR_ISBN VARCHAR2(20)
);
ALTER TABLE KSIAZKA
ADD CONSTRAINT KSIAZKA_PK PRIMARY KEY
(
KSI_ID_KSIAZKA
);
--------------------------------------------
-------------UNIQUE----------------------------
------------------------------------------------
ALTER TABLE KSIAZKA
add CONSTRAINT UNQ_KSIAZKA UNIQUE
(
KSI_ID_GATUNEK,
KSI_ID_AUTOR,
KSI_ID_KSIAZKA
--KSI_NR_ISBN
);
--------------------------------------------------
---------------KLUCZE OBCE-----------------
---------------------------------------------------
ALTER TABLE KSIAZKA
ADD CONSTRAINT KSIAZKA_FK1 FOREIGN KEY
(
KSI_ID_GATUNEK
)
REFERENCES GATUNEK
(
GAT_ID_GATUNEK
)
ENABLE;
ALTER TABLE KSIAZKA
ADD CONSTRAINT KSIAZKA_FK0 FOREIGN KEY
(
KSI_ID_AUTOR
)
REFERENCES AUTOR
(
AUT_ID_AUTOR
)
ENABLE;
-----------------------------------------------------------------------
--------------GENERATOR-------------------------------------
----------------------------------------------------------
to są moje tabele
CREATE OR REPLACE PACKAGE PAKIET IS
TYPE tab_imie IS TABLE OF varchar2(20) INDEX BY BINARY_INTEGER;
TYPE tab_nazwisko IS TABLE OF varchar2(30) INDEX BY BINARY_INTEGER;
TYPE tab_tytul IS TABLE OF varchar2(45) INDEX BY BINARY_INTEGER;
TYPE tab_gatunek IS TABLE OF varchar2(45) INDEX BY BINARY_INTEGER;
TYPE IND IS TABLE OF NUMBER(30) INDEX BY BINARY_INTEGER;
PROCEDURE generatorG(ile IN NUMBER);
PROCEDURE generatorA(ile IN NUMBER);
PROCEDURE generatorK(ile IN NUMBER);
END PAKIET;
/
CREATE OR REPLACE PACKAGE BODY PAKIET IS
PROCEDURE generatorK(ile IN NUMBER)
IS
--l1 NUMBER(2);
--l2 NUMBER(2);
licznik NUMBER(8);
tytuly tab_tytul;
title NUMBER(3);
years NUMBER(4);
DSU NUMBER(3);
tab IND;
nr_isbn VARCHAR2(20);
ksinr NUMBER(8);
BEGIN
licznik:=0;
@F:\base\tytuly.sql;
--@F:\base\isbn.sql;
--IMIONA:=tab_imie('Mateusz','Aneta','Kacper','Andrzej','Michał');
--NAZWISKA:=tab_nazwisko('Wójcik', 'Brud','Wolski','Musk','Sus');
while licznik < ile+1
LOOP
title:=dbms_random.value(1,50);
years:=dbms_random.value(1965,2013);
tab(0):=9;tab(1):=7;tab(2):=8;tab(3):=8;tab(4):=3;
tab(5):=dbms_random.value(0,9);
tab(6):=dbms_random.value(0,9);
tab(7):=dbms_random.value(0,9);
tab(8):=dbms_random.value(0,9);
tab(9):=dbms_random.value(0,9);
tab(10):=dbms_random.value(0,9);
tab(11):=dbms_random.value(0,9);
DSU:=(10-((tab(0)+tab(2)+tab(4)+tab(6)+tab(8)+tab(10)+3*(tab(1)+tab(3)+tab(5)+tab(7)+tab(9)+tab(11))) mod 10));
nr_isbn:=to_char((tab(0)||tab(1)||tab(2)||'-'||tab(3)||tab(4)||'-'||tab(5)||tab(6)||tab(7)||tab(8)||tab(9)||tab(10)
||tab(11)||'-'||DSU));
INSERT INTO KSIAZKA (KSI_TYTUL,KSI_ROK_WYDANIA,KSI_NR_ISBN) VALUES(tytuly(title),years,nr_isbn) RETURNING KSI_ID_KSIAZKA INTO ksinr;
licznik:=licznik+1;
END LOOP;
END;
-------------------------------------------------------------------------------------------------
PROCEDURE generatorA(ile IN NUMBER)
IS
licznik NUMBER(7);
imiona tab_imie;
name NUMBER(3);
nazwiska tab_nazwisko;
surname NUMBER(3);
autnr NUMBER(7);
BEGIN
licznik:=0;
@F:\base\imiona.sql;
@F:\base\nazwiska.sql;
while licznik < ile+1
LOOP
SAVEPOINT gena;
name:=dbms_random.value(1,50);
surname:=dbms_random.value(1,50);
INSERT INTO AUTOR (AUT_IMIE,AUT_NAZWISKO) VALUES(imiona(name),nazwiska(surname)) RETURNING AUT_ID_AUTOR INTO autnr;
licznik:=licznik+1;
IF SQL%NOTFOUND THEN
ROLLBACK TO gena;
END IF;
END LOOP;
END;
-----------------------------------------------------------------------------------------------------------------------------------
PROCEDURE generatorG(ile IN NUMBER)
IS
licznik NUMBER(7);
gatnr NUMBER(7);
gatunki tab_gatunek;
grade NUMBER(3);
BEGIN
licznik:=0;
@F:\base\gatunki.sql;
while licznik < ile+1
LOOP
SAVEPOINT geng;
grade:=dbms_random.value(1,50);
INSERT INTO GATUNEK(GAT_GATUNEK) VALUES(gatunki(grade)) RETURNING GAT_ID_GATUNEK INTO gatnr;
licznik:=licznik+1;
IF SQL%NOTFOUND THEN
ROLLBACK TO geng;
END IF;
END LOOP;
END;
END;
/
show error;
exec PAKIET.generatorG(1000);
exec PAKIET.generatorA(150000);
exec PAKIET.generatorK(1200000);
a tu generator o którym mowa. Problemem jest to, że gdy uruchomię swoją bazę otrzymuję błąd
Ciało pakietu zostało utworzone.
Nie ma błędów.
Procedura PL/SQL została zakończona pomyślnie.
Procedura PL/SQL została zakończona pomyślnie.
BEGIN PAKIET.generatorK(120000); END;
*
BŁĄD w linii 1:
ORA-01403: no data found
ORA-06512: at "NONAME.PAKIET", line 90
ORA-06512: at line 1
Nie wiem jak rozwiązać mój problem ponieważ przy podaniu małej liczby jako argumentu procedury wszystko jest ok ale gdy liczba jest większa występuje ww. błąd. Dodam, że liczba podana jako argument musi być >1000000. Bardzo proszę o wskazówki.
Pozdrawiam.
Zauważyłem, że jeśli ustawie exec PAKIET.generatorK(99) to wszystko działa, natomiast jesśli wstawię liczbę trzycyfrową wyrzuca wyżej pokazany błąd.