Witam od jakiegoś czasu zacząłem się sam uczyć SQL i teraz dodałem PLSQL. Chciałbym się w tym kierunku rozwijać i w przyszłości szukać pracy w takim obrębie.
Z stąd moje pytanie
Czy ktoś zna projekty które mógłbym robić czysto naukowo dla siebie, a z którymi w przybliżeniu mógłbym napotkać się w przyszłości w pracy
Raczej ciężko o jakiś "standard" jeśli chodzi o oracle (bo podałeś PL/SQL) to z pewnością musisz nauczyć się kilku podstawowych rzeczy. Wymyśl sobie jakiś projekt np bibliotekę, wymyśl strukturę, stwórz tabele, procedury, funkcje, pakiety do zarządzania tymi tabelami. Gdy już będzie gotowe to zacznij faktycznie tego używać czyli jakiś import książek itp. Do tego jakiś interfejs "wypożyczania" np webowy. To pozwoli zapoznać Ci się np z oracle forms, apex lub innym językiem. Z istotnych narzędzi oracle to koniecznie dbms_profiler, dbms_job, UTL_FILE,XML, dbms_output
Dobra A wiec projekt Baz danych BIBLIOTEKI
Będę w tym temacie umieszczał etapy tworzenie Bazy i chciałbym abyście rzucali mi kłody pod nogi, co jeszcze mógłbym zrobić, oraz pomagać gdy czegoś nie będę potrafił.
Skorzystałem z gotowego wzoru na którym będę się opierał.
Wzór :
http://www.obrazki.wiedzanaplus.pl/bazy_danych/mysql/internetowy_system_biblioteczny/projekt-biblioteki-szkolnej.png
A tutaj przedstawiam stworzenie
create datebase Projekt_Biblioteka;
create table bibliotekraz
(
Id_Biblitekarz integer Constraint Id_Biblitekarz_pk PRIMARY KEY,
Login number(13),
Haslo varchar(20)
)
create table Admin
(
Id_Admin integer Constraint Id_Admin_pk Primary key,
Login number(13),
Haslo varchar(20)
)
create table Kategoria
(
Id_kategoria Integer constraint Id_kategoria_pk PRIMARY KEY ,
Nazwa Varchar(200)
)
create Table Ksiazka
(
Id_Ksiazka integer forgein Id_Ksiazka_pk PRIMARY KEY,
Id_Kategoria integer ,
ISBN varchar(20),
Tytul Varchar(200),
Autor Varchar(200),
Stron integer(4),
Wydawnictwo Varchar(50),
Rok_Wydania integer(4),
Opis Text,
CONSTRAINT Id_Kategoria_fk FOREIGN KEY (Id_Kategoria) REFERENCES Kategoria(Id_Kategoria)
)
create table zamowienie
(
Id_Zamowienia integer constraint Id_Zamowienia_pk PRIMARY KEY ,
Id_Czytelnik integer,
Id_Ksiazka Integer,
Data_Zamowienia DateTime,
Data_Odbioru DateTime,
Data_Zwrotu DateTime ,
CONSTRAINT Id_Czytelnik_fk FOREIGN KEY (Id_Czytelnik) REFERENCES Czytelnik(Id_Czytelnik),
CONSTRAINT Id_Ksiazka_fk FOREIGN KEY (Id_Ksiazka) REFERENCES Ksiazka(Id_Ksiazka)
)
Create Table Czytelnik
(
Id_Czytelnik Integer Constraint Id_Czytelnik_pk PRIMARY KEY,
Login Varchar(50),
Haslo Varchar(40),
Imie Varchar (50),
Nazwisko Varchar (50),
Adres Varchar(50),
Miasto Varchar(50),
Wojewodzwo varchar(50),
Telefon Numbeer(13),
Kod_Pocztowy Varchar(40),
email Varchar(50)
)
Osobna tabela Autorzy, tabela AutorzyKsiazki, zamiast pole w Ksiazka. Podobnie z kategoriami (wiele do wielu).
Czedmu Loginy i Telkefon to Number? Bedziesz je sumowac?
Kod pocztowy varchar(40) - rozrzutnyś... Za to poskąpiłeś na email...
No i wszedzie ID na sekwencjach powinny byc...
Marcin.Miga napisał(a):
Osobna tabela Autorzy, tabela AutorzyKsiazki, zamiast pole w Ksiazka. Podobnie z kategoriami (wiele do wielu).
Czedmu Loginy i Telkefon to Number? Bedziesz je sumowac?
Kod pocztowy varchar(40) - rozrzutnyś... Za to poskąpiłeś na email...
No i wszedzie ID na sekwencjach powinny byc...
O dzięki właśnie o to mi chodziło o takie uwagi. Wrzucam poprawione.
Co zrobiłem
*Dodałem osobną kolumnę Autorzy, (id_autora, Imię_Autora, Nazwisko_Nazwisko )
*Loginy zamieniłem na varchar a telefon na integer
*dodałem not null
*oraz stworzyłem sekwencje sekw_id
I Przy sekwencji narodziło się pytanie, a co jeśli jakaś książka zostanie usunięta, sekwencja tego nie zauważy i będzie leciała dalej, Tutaj chyba będzie trzeba w przyszłości stworzyć procedurę jakąś ?
create datebase Projekt_Biblioteka;
create table bibliotekraz
(
Id_Biblitekarz integer Constraint Id_Biblitekarz_pk PRIMARY KEY,
Login varchar(20) not null,
Haslo varchar(20) not null
)
create table Admin
(
Id_Admin integer Constraint Id_Admin_pk Primary key,
Login varchar(20) not null,
Haslo varchar(20) not null
)
create table Kategoria
(
Id_kategoria Integer constraint Id_kategoria_pk PRIMARY KEY ,
Nazwa Varchar(200) not null
)
create Table Ksiazka
(
Id_Ksiazka integer forgein Id_Ksiazka_pk PRIMARY KEY,
Id_Kategoria integer ,
Id_Autora integer,
ISBN varchar(20) ,
Tytul Varchar(200) not null,
Stron integer(4) not null,
Wydawnictwo Varchar(50) not null,
Rok_Wydania integer(4) not null,
Opis Text,
CONSTRAINT Id_Kategoria_fk FOREIGN KEY (Id_Kategoria) REFERENCES Kategoria(Id_Kategoria)
CONSTRAINT Id_Autora_fk FOREIGN KEY (Id_Autora) REFERENCES Autorzy(Id_Autora)
)
create table zamowienie
(
Id_Zamowienia integer constraint Id_Zamowienia_pk PRIMARY KEY ,
Id_Czytelnik integer,
Id_Ksiazka Integer,
Data_Zamowienia DateTime not null,
Data_Odbioru DateTime not null ,
Data_Zwrotu DateTime not null,
CONSTRAINT Id_Czytelnik_fk FOREIGN KEY (Id_Czytelnik) REFERENCES Czytelnik(Id_Czytelnik),
CONSTRAINT Id_Ksiazka_fk FOREIGN KEY (Id_Ksiazka) REFERENCES Ksiazka(Id_Ksiazka)
)
Create Table Czytelnik
(
Id_Czytelnik Integer Constraint Id_Czytelnik_pk PRIMARY KEY,
Login Varchar(50) not null,
Haslo Varchar(40) not null,
Imie Varchar (50) not null,
Nazwisko Varchar (50) not null,
Adres Varchar(50) not null,
Miasto Varchar(50) not null,
Wojewodzwo varchar(50) not null,
Telefon Integer(13) not null,
Kod_Pocztowy Varchar(10) not null,
email Varchar(100)
)
create table Autorzy
(
Id_Autora Integer Constraint Id_Autora_pk PRIMARY KEY,
Imie_Autora Varchar(20) not null,
Nazwisko_Autora Varchar(30) not null
)
create sequence sekw_id
minvalue 1
start with 1
Increment by 1
Bibliotekarz nie ma adresu? Nie może być też jednocześnie czytelnikiem w tej bibliotece?
Dregorio napisał(a):
Bibliotekarz nie ma adresu? Nie może być też jednocześnie czytelnikiem w tej bibliotece?
Słuszna uwaga.
Czyli najlepiej do Tabeli Bibliotekarz dodać Id_Czytelnik
A zadania na dziś to porobić inserty i uzupełnić bazę
Ktoś ma jeszcze uwagi ?
Osobna tabela Autorzy, tabela AutorzyKsiazki, zamiast pole w Ksiazka. Podobnie z kategoriami (wiele do wielu).
No i wszedzie ID na sekwencjach powinny byc...
Marcin.Miga napisał(a):
Osobna tabela Autorzy, tabela AutorzyKsiazki, zamiast pole w Ksiazka. Podobnie z kategoriami (wiele do wielu).
No i wszedzie ID na sekwencjach powinny byc...
Nie zrozumiałem w pierwszym poście o co chodziło, Ale teraz rozumie, chociaż nie wiem czy dobrze zrobiłem. Wiele do wielu czyli tworzymy tabelę łącznikową.
Co do sekwencji na ID na Oracle chyba nie ma czegoś takiego jak (MySQL (AUTO_INCREMENT) albo MS SQL (IDENTITY)?.
create datebase Projekt_Biblioteka;
create table bibliotekraz
(
Id_Biblitekarz integer Constraint Id_Biblitekarz_pk PRIMARY KEY,
Id_Czytelnika integer
Login varchar(20) not null,
Haslo varchar(20) not null
CONSTRAINT Id_Czytelnika_fk FOREIGN KEY (Id_Czytelnika) REFERENCES Czytelnik(Id_Czytelnik)
)
create table Admin
(
Id_Admin integer Constraint Id_Admin_pk Primary key,
Login varchar(20) not null,
Haslo varchar(20) not null
)
create table Kategoria
(
Id_Kategoria Integer constraint Id_kategoria_pk PRIMARY KEY ,
Nazwa Varchar(200) not null
)
create table Kategoria_Ksiazki
(
Id_Kategoria integer,
Id_Ksiazka integer,
CONSTRAINT Id_Kategoria_fk FOREIGN KEY (Id_Kategoria) REFERENCES Kategoria(Id_Kategoria),
CONSTRAINT Id_Ksiazka_fk FOREIGN KEY (Id_Ksiazka) REFERENCES Ksiazka(Id_Ksiazka)
)
create Table Ksiazka
(
Id_Ksiazka integer forgein Id_Ksiazka_pk PRIMARY KEY,
Id_Kategoria integer ,
Id_Autorzy integer,
ISBN varchar(20) ,
Tytul Varchar(200) not null,
Stron integer(4) not null,
Wydawnictwo Varchar(50) not null,
Rok_Wydania integer(4) not null,
Opis Text,
CONSTRAINT Id_Kategoria_fk FOREIGN KEY (Id_Kategoria) REFERENCES Kategoria(Id_Kategoria),
CONSTRAINT Id_Autorzy_fk FOREIGN KEY (Id_Autorzy) REFERENCES Autorzy(Id_Autora)
)
create table zamowienie
(
Id_Zamowienia integer constraint Id_Zamowienia_pk PRIMARY KEY ,
Id_Czytelnik integer,
Id_Ksiazka Integer,
Data_Zamowienia DateTime not null,
Data_Odbioru DateTime not null ,
Data_Zwrotu DateTime not null,
CONSTRAINT Id_Czytelnik_fk FOREIGN KEY (Id_Czytelnik) REFERENCES Czytelnik(Id_Czytelnik),
CONSTRAINT Id_Ksiazka_fk FOREIGN KEY (Id_Ksiazka) REFERENCES Ksiazka(Id_Ksiazka)
)
Create Table Czytelnik
(
Id_Czytelnik Integer Constraint Id_Czytelnik_pk PRIMARY KEY,
Login Varchar(50) not null,
Haslo Varchar(40) not null,
Imie Varchar (50) not null,
Nazwisko Varchar (50) not null,
Adres Varchar(50) not null,
Miasto Varchar(50) not null,
Wojewodzwo varchar(50) not null,
Telefon Integer(13) not null,
Kod_Pocztowy Varchar(10) not null,
email Varchar(100)
)
create table Autor
(
Id_Autora Integer Constraint Id_Autora_pk PRIMARY KEY,
Imie_Autora Varchar(20) not null,
Nazwisko_Autora Varchar(30) not null
)
Create table Autorzy
(
Id_Autora Integer ,
Id_Ksiazka integer,
CONSTRAINT Id_Autora_fk FOREIGN KEY (Id_Autora) REFERENCES Autor(Id_Autora),
CONSTRAINT Id_Ksiazka _fk FOREIGN KEY (Id_Ksiazka ) REFERENCES Ksiazka(Id_Ksiazka )
)
create sequence sekw_id
minvalue 1
start with 1
Increment by 1
Prawie OK. Teraz z tabeli Ksiazka mozesz (a nawet powinieneś) wywalić pola ID_Kategoria i ID_Autorzy i wywalic constrainty.
Co do sekwencji, to nawet jak teraz zrobisz NEXTVAL, to masz tylko jednego sekwencera ... I co, będziesz go współdzielil między różne ID? Powinieneś mieć tyle sekwencerów, ile tabel z kolumnami ID.
Niestety rozłożyła mnie grypa a że w pracy nie mogłem iść jeszcze na L4 bo będę miał nie płatne, to się tak męczyłem a już tu zajrzeć nie miałem chęci. Dopiero dzisiaj chwile posiedziałem i fajne rozwiązanie znalazłem co do numerowanie z użyciem TRIGGER-a
Marcin.Miga Prosił bym o ocenę i jeszcze ewentualne co poprawić uwagi, a jak będzie dobrze to trochę wypełnię danymi
create datebase Projekt_Biblioteka;
create table bibliotekraz
(
Id_Biblitekarz integer Constraint Id_Biblitekarz_pk PRIMARY KEY,
Id_Czytelnika integer
Login varchar(20) not null,
Haslo varchar(20) not null
CONSTRAINT Id_Czytelnika_fk FOREIGN KEY (Id_Czytelnika) REFERENCES Czytelnik(Id_Czytelnik)
)
create table Admin
(
Id_Admin integer Constraint Id_Admin_pk Primary key,
Login varchar(20) not null,
Haslo varchar(20) not null
)
create table Kategoria
(
Id_Kategoria Integer constraint Id_kategoria_pk PRIMARY KEY ,
Nazwa Varchar(200) not null
)
create table Kategoria_Ksiazki
(
Id_Kategoria integer,
Id_Ksiazka integer,
CONSTRAINT Id_Kategoria_fk FOREIGN KEY (Id_Kategoria) REFERENCES Kategoria(Id_Kategoria),
CONSTRAINT Id_Ksiazka_fk FOREIGN KEY (Id_Ksiazka) REFERENCES Ksiazka(Id_Ksiazka)
)
create Table Ksiazka
(
Id_Ksiazka integer forgein Id_Ksiazka_pk PRIMARY KEY,
ISBN varchar(20) ,
Tytul Varchar(200) not null,
Stron integer(4) not null,
Wydawnictwo Varchar(50) not null,
Rok_Wydania integer(4) not null,
Opis Text,
)
create table zamowienie
(
Id_Zamowienia integer constraint Id_Zamowienia_pk PRIMARY KEY ,
Id_Czytelnik integer,
Id_Ksiazka Integer,
Data_Zamowienia DateTime not null,
Data_Odbioru DateTime not null ,
Data_Zwrotu DateTime not null,
CONSTRAINT Id_Czytelnik_fk FOREIGN KEY (Id_Czytelnik) REFERENCES Czytelnik(Id_Czytelnik),
CONSTRAINT Id_Ksiazka_fk FOREIGN KEY (Id_Ksiazka) REFERENCES Ksiazka(Id_Ksiazka)
)
Create Table Czytelnik
(
Id_Czytelnik Integer Constraint Id_Czytelnik_pk PRIMARY KEY,
Login Varchar(50) not null,
Haslo Varchar(40) not null,
Imie Varchar (50) not null,
Nazwisko Varchar (50) not null,
Adres Varchar(50) not null,
Miasto Varchar(50) not null,
Wojewodzwo varchar(50) not null,
Telefon Integer(13) not null,
Kod_Pocztowy Varchar(10) not null,
email Varchar(100)
)
create table Autor
(
Id_Autora Integer Constraint Id_Autora_pk PRIMARY KEY,
Imie_Autora Varchar(20) not null,
Nazwisko_Autora Varchar(30) not null
)
Create table Autorzy
(
Id_Autora Integer ,
Id_Ksiazka integer,
CONSTRAINT Id_Autora_fk FOREIGN KEY (Id_Autora) REFERENCES Autor(Id_Autora),
CONSTRAINT Id_Ksiazka _fk FOREIGN KEY (Id_Ksiazka ) REFERENCES Ksiazka(Id_Ksiazka )
)
create sequence sekw_id_Bibliotekarz
minvalue 1
start with 1
Increment by 1
CREATE OR REPLACE TRIGGER sekw_id_Bibliotekarz _PODSTAW_PK
BEFORE INSERT ON Bibliotekarz
FOR EACH ROW
BEGIN
:new.ID:=sekw_id_Bibliotekarz .nextval;
END;
create sequence sekw_id_Admin
minvalue 1
start with 1
Increment by 1
CREATE OR REPLACE TRIGGER sekw_id_Admin_PODSTAW_PK
BEFORE INSERT ON Admin
FOR EACH ROW
BEGIN
:new.ID:=sekw_id_Admin.nextval;
END;
create sequence sekw_id_Kategoria
minvalue 1
start with 1
Increment by 1
CREATE OR REPLACE TRIGGER sekw_id_Kategoria_PODSTAW_PK
BEFORE INSERT ON Kategoria
FOR EACH ROW
BEGIN
:new.ID:=sekw_id_Kategoria.nextval;
END;
create sequence sekw_id_Ksiazka
minvalue 1
start with 1
Increment by 1
CREATE OR REPLACE TRIGGER sekw_id_Ksiazka_PODSTAW_PK
BEFORE INSERT ON Ksiazka
FOR EACH ROW
BEGIN
:new.ID:=sekw_id_Ksiazka.nextval;
END;
create sequence sekw_id_Zamowienie
minvalue 1
start with 1
Increment by 1
CREATE OR REPLACE TRIGGER sekw_id_Zamowienie_PODSTAW_PK
BEFORE INSERT ON Zamówienie
FOR EACH ROW
BEGIN
:new.ID:=sekw_id_Zamowienie.nextval;
END;
create sequence sekw_id_Czytelnik
minvalue 1
start with 1
Increment by 1
CREATE OR REPLACE TRIGGER sekw_id_Czytelnik_PODSTAW_PK
BEFORE INSERT ON Czytelnik
FOR EACH ROW
BEGIN
:new.ID:=sekw_id_Czytelnik.nextval;
END;
create sequence sekw_id_Autor
minvalue 1
start with 1
Increment by 1
CREATE OR REPLACE TRIGGER sekw_id_Autor_PODSTAW_PK
BEFORE INSERT ON Autro
FOR EACH ROW
BEGIN
:new.ID:=sekw_id_Autor.nextval;
END;
Moje zmiany:
create table Kategoria
(
Id_Kategoria Integer constraint Id_kategoria_pk PRIMARY KEY ,
Nazwa Varchar(200) not null unique
)
create table Kategoria_Ksiazki
(
Id_Kategoria integer,
Id_Ksiazka integer,
CONSTRAINT Id_Kategoria_fk FOREIGN KEY (Id_Kategoria) REFERENCES Kategoria(Id_Kategoria),
CONSTRAINT Id_Ksiazka_fk FOREIGN KEY (Id_Ksiazka) REFERENCES Ksiazka(Id_Ksiazka),
unique(id_kategoria, id_ksiazka)
)
create table Autor
(
Id_Autora Integer Constraint Id_Autora_pk PRIMARY KEY,
Imie_Autora Varchar(20) not null,
Nazwisko_Autora Varchar(30) not null,
unique(imie_autora,nazwisko_autora)
)
Create table Autorzy
(
Id_Autora Integer ,
Id_Ksiazka integer,
CONSTRAINT Id_Autora_fk FOREIGN KEY (Id_Autora) REFERENCES Autor(Id_Autora),
CONSTRAINT Id_Ksiazka _fk FOREIGN KEY (Id_Ksiazka ) REFERENCES Ksiazka(Id_Ksiazka ),
unique(id_autora, id_ksiazka)
)
- literowki typu wojewodzwo, bibliotekraz
I oczywiscie kolejnosc, bo nie mozesz miec referencji do tabeli, ktorej nie masz - sredniki
A nie lepiej zamiast robić triggery mające właściości identity do PK przy tworzeniu tabeli zawrzeć klauzule: GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1)? Przykład:
create table table (
kolumna1 INT GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
kolumna1 VARCHAR2(50)
);
(dostępne od Oracle 12c)
Świetny Szewc rozwiązanie fajne ale ja bazuje na starczej wersji. Ale zachowam sobie.
Co do dalszego rozwoju bazy, cierpię na brak czasu. dopiero w niedziele znalazłem trochę czasu aby uzupełnić danymi , żeby trochę szybciej stworzyłem sobie bloki.
declare -- dodawanie admina
Haslo varchar(20) := &Podaj_haslo;
Haslo2 varchar(20) := &Powtorz_haslo;
L char(20):=&Podaj_Login;
begin
if haslo = haslo2 then
DBMS_OUTPUT.PUT_LINE('Haslo wpisane prawidlowo dla loginu '||(L));
insert into Admin (login, haslo) values (L,Haslo);
else
DBMS_OUTPUT.PUT_LINE( 'bledne haslo');
end if;
end;
declare -- dodawanie ksiazki
ISBN varchar(20) := &Podaj_ISBN;
Tytul varchar(200) := &Podaj_tytul;
Stron integer := &Podaj_ilosc_stron;
Wydawnictwo Varchar(50) := &podaj_wydawnictwo ;
Rok_Wydania integer := &podaj_rok_wydania;
Opis Varchar2(4000) := &Podaj_opis;
begin
insert into Ksiazka (ISBN,Tytul,stron,wydawnictwo,rok_wydania,opis) values (ISBN,Tytul,stron,wydawnictwo,rok_wydania,opis);
DBMS_OUTPUT.PUT_LINE( 'Wypelnione prawidowo');
end;
declare -- dodawanie kategori
Nazwa Varchar(200) :=&podaj_kategorie ;
begin
insert into Kategoria (Nazwa) values (Nazwa);
DBMS_OUTPUT.PUT_LINE( 'Wypelnione prawidowo');
end;
declare -- dodawanie Autor
Imie_Autora Varchar(20) := &_Imie_Autora;
Nazwisko_Autora Varchar(30) := &_Nazwisko_Autora;
begin
insert into Autor (Imie_Autora, Nazwisko_Autora) values (Imie_Autora, Nazwisko_Autora);
DBMS_OUTPUT.PUT_LINE( 'Wypelnione prawidowo');
end;
declare -- dodawanie Czytelnik
Login Varchar(50) := &Login;
Haslo Varchar(40):= &Haslo;
Imie Varchar(50) := &Imie;
Nazwisko Varchar(50) := &Nazwisko;
Adres Varchar(50) := &Adres;
Miasto Varchar(50) := &Miasto;
Wojewodzwo Varchar(50) := &Wojewodzwo;
Telefon integer := &telefon ;
Kod_Pocztowy Varchar(10) := &Kod_pocztowy;
email Varchar(100) := &email;
begin
insert into Czytelnik (Login, Haslo,Imie,Nazwisko, Adres, Miasto, wojewodzwo, telefon, Kod_pocztowy,email)
values (Login, Haslo,Imie,Nazwisko, Adres, Miasto, wojewodzwo, telefon, Kod_pocztowy,email);
DBMS_OUTPUT.PUT_LINE( 'Wypelnione prawidowo');
end;
declare -- dodawanie bibliotekarz
Id_Czytelnika integer := &Podaj_Id_czytelnika ;-- bibliotekarz musi być wpierw dodany do czytelnika
Login varchar(20) := &podaj_login ;
Haslo varchar(20) := &podaj_haso ;
begin
insert into bibliotekarz (Id_Czytelnika, Login, Haslo)
values (Id_Czytelnika, Login, Haslo) ;
DBMS_OUTPUT.PUT_LINE( 'Wypelnione prawidowo');
end;
declare -- dodawanie Kategoria_Ksiazki
Id_Kategoria integer := &ID_kategori ;
Id_Ksiazka integer := &ID_Ksizkki ;
begin
insert into Kategoria_Ksiazki (Id_Kategoria, Id_Ksiazka)
values (Id_Kategoria, Id_Ksiazka) ;
DBMS_OUTPUT.PUT_LINE( 'Wypelnione prawidowo');
end;
declare -- dodawanie Autorzy
Id_Autora Integer := &podaj_ID_Autora;
Id_Ksiazka integer := &podaj_ID_Ksiazka;
begin
insert into Autorzy (Id_Autora, Id_Ksiazka)
values (Id_Autora, Id_Ksiazka) ;
DBMS_OUTPUT.PUT_LINE( 'Wypelnione prawidowo');
end;
declare -- dodawanie Zamówienie
Id_Czytelnik integer :=&podaj_ID_czytelnika;
Id_Ksiazka Integer :=&podaj_ID_ksiazki ;
Data_Zamowienia Date ;
Data_Odbioru Date := &podaj_Date_odbioru; -- TRZEBA PISAC W FORMIE YY/MM/DD
Data_Zwrotu Date := &podaj_date_zwrotu; --TRZEBA PISAC W FORMIE YY/MM/DD
begin
select sysdate into Data_Zamowienia from dual;
insert into Zamowienie (Id_Czytelnik, Id_Ksiazka,Data_Zamowienia,Data_Odbioru,Data_Zwrotu)
values (Id_Czytelnik, Id_Ksiazka,Data_Zamowienia,Data_Odbioru,Data_Zwrotu) ;
DBMS_OUTPUT.PUT_LINE( 'Wypelnione prawidowo');
end;
Teraz pytanie. CO DALEJ ROBIĆ ?
Marcin.Miga ):
Panie Marcinie mógłby pan się wypowiedzieć, Co robić jako kolejną rzecz ? Jakieś procedury ? Bo jako umiem wykorzystywać sql w zapytaniach to tutaj w tworzeniu jestem zielony i nie wiem co robić jako kolejne ?
Nie znam tak dobrze Oracle by się wypowiadać a po drugie nie wiem co chcesz osiągnąć.
Mozesz spróbować wykonać jakis raport uruchamiany z schedulera.
Piszesz procedurę, która generuje zestawienie ksiazek wypożyczonych w ostatnim tygodniu.
Zestawienie ma być zrzucane do csv raz w tygodniu - zadanie dbms_scheduler.
Moze byc tez jakiś raport książek nieoddanych w terminie, itp.
Marcin.Miga napisał(a):
Nie znam tak dobrze Oracle by się wypowiadać a po drugie nie wiem co chcesz osiągnąć.
Panie Marcinie. Projekt czysto szkoleniowy i chciałbym zrobić jak najbardziej rozbudowaną, napierdzielać funkcje procedury, tylko też z senesem. Finalnie chciałbym zrobić jeszcze warstwę graficzną i umieścić na jakimś serwerze
juro napisał(a):
Mozesz spróbować wykonać jakis raport uruchamiany z schedulera.
Piszesz procedurę, która generuje zestawienie ksiazek wypożyczonych w ostatnim tygodniu.
Zestawienie ma być zrzucane do csv raz w tygodniu - zadanie dbms_scheduler.Moze byc tez jakiś raport książek nieoddanych w terminie, itp.
O dzięki właśnie o takie coś mi chodziło. Wieczorem po pracy będę działał I po tym dopatrzyłem już błąd w mojej bazie że, data zwrotu jest not null,
Mam problem ze stworzeniem formularza csv trochę pogrzebałem w internecie i jakoś nie mogę dojść do rozwiązania
a mianowicie załóżmy ze chce zrobić raport wypożyczonych książek w dnia poprzedniego . i by zapisywany był w CSV.
Mam coś takiego i jakoś nie może zapisać do pliku. Gdzie szukać błędu ? i gdzie pomocy ?
DECLARE
file_handle utl_file.file_type;
BEGIN
file_handle := utl_file.fopen('Dane', 'plik1.csv', 'w');
FOR a IN (
select * from zamowienie
where Data_Zamowienia between to_date(select sysdate-1 from dual ) and (select sysdate from dual )
) LOOP
utl_file.put_line(file_handle, a.Id_Czytelnik || ';' || a.Id_Ksiazka || ';');
END LOOP;
utl_file.fclose(file_handle);
end;
Masz błąd w samym select:
select * from zamowienie
where Data_Zamowienia between to_date(select sysdate-1 from dual ) and (select sysdate from dual )
Powinno być:
SELECT *
FROM zamowienie
WHERE Data_Zamowienia BETWEEN (SYSDATE - 1) AND SYSDATE
Reszta jest ok, o ile masz utworzone DIRECTORY o nazwie 'Dane'.
Nie miałeś żadnego komunikatu błędu?
juro napisał(a):
Masz błąd w samym select:
select * from zamowienie where Data_Zamowienia between to_date(select sysdate-1 from dual ) and (select sysdate from dual )
Powinno być:
SELECT * FROM zamowienie WHERE Data_Zamowienia BETWEEN (SYSDATE - 1) AND SYSDATE
Reszta jest ok, o ile masz utworzone DIRECTORY o nazwie 'Dane'.
Nie miałeś żadnego komunikatu błędu?
ok poprawiłem zapytanie, ale przymuszam że po mojemu chociaż mniej zgrabniej to powinno pójść
wklejam błąd
Error starting at line : 23 in command -
DECLARE
file_handle utl_file.file_type;
BEGIN
file_handle := utl_file.fopen('DANE', 'plik1.csv', 'w');
FOR a IN (
SELECT *
FROM zamowienie
WHERE Data_Zamowienia BETWEEN (SYSDATE - 1) AND SYSDATE )
LOOP
utl_file.put_line(file_handle, a.Id_Czytelnik || ';' || a.Id_Ksiazka || ';');
END LOOP;
utl_file.fclose(file_handle);
end;
Error report -
ORA-06550: line 2, column 15:
PLS-00201: identifier 'UTL_FILE' must be declared
ORA-06550: line 2, column 15:
PL/SQL: Item ignored
ORA-06550: line 4, column 3:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored
ORA-06550: line 10, column 23:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 10, column 5:
PL/SQL: Statement ignored
ORA-06550: line 12, column 19:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 12, column 3:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
Użytkownik którym próbujesz to wykonać nie ma uprawnień do UTL_FILE. Z sysdba musisz mu nadać uprawnienie EXECUTE do tego pakietu.
juro napisał(a):
Użytkownik którym próbujesz to wykonać nie ma uprawnień do UTL_FILE. Z sysdba musisz mu nadać uprawnienie EXECUTE do tego pakietu.
sek w tym że ma tylko głównego użytkownika",system" utworzonego przy tworzeniu bazy
GRANT READ,WRITE ON DIRECTORY DANE TO system;
i gdy wykonuje polecenie to mam błąd że sam sobie nie mogę nadawać i odbierać uprawnień
GRANT READ,WRITE ON DIRECTORY DANE TO system
Error report -
ORA-01749: you may not GRANT/REVOKE privileges to/from yourself
01749. 00000 - "you may not GRANT/REVOKE privileges to/from yourself"
*Cause:
*Action:
Dodałeś te wszystkie tabelki na użytkowniku system? Tak nie powinno się robić w oracle jest tablesace odpowiadający jednemu użytkownikowi. Musisz założyć swój tablespace i swojego użytkownika. Dopiero w nich dodać swoje tabelki. Potem kiedy robisz selecty to robisz je do swoich schematów. Dla jednego użytkownika system możesz mieć wiele schematów.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.