[SQL]Problem z generatorem danych (Error: no data found)


(marroz28) #1

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.


(Wojciechmuszynski) #2

Próbowałem przeanalizować załączony kod i jednej rzeczy nie udało mi się znaleźć.

Nie wiem w jaki sposób są nadawane ID w tabeli KSIAZKA.

Z analizy kodu PL/SQL wynika, że:

W procedurze GeneratorK tworzony jest insert do tabeli KSIAZKA. Jednocześnie odczytywany (returning) jest ID wczytanego rekordu (w tym przypadku jest to pole KSI_ID_KSIAZKA).

Tylko nigdzie nie widzę, w jaki sposób pole KSI_ID_KSIAZKA jest ustawiane.

Podejrzewam, że jest gdzieś jakiś trigger na tabeli KSIAZKA, którego nie dodałeś do kodu. Być może to właśnie ten trigger psuje inserta.

Natomiast błąd oznacza po prostu, że nie udało się dodać rekordu do tabeli (z tym, że Returning powoduje odczyt - stąd “no data found”