Šta je novo?

Oracle/SQL

Učlanjen(a)
04.12.2005
Poruke
314
Poena
319
Koja je najbolja platforma za rad sa Oracle databases?

Imam neki projekat koji treba da odradim na Unix serveru( napravi file sa SQL codom I onda execute na oracle server.)

nervira me sto stalno moram da idem sa unix-a na oracle i tako non stop. Od toga sam odustao i otisao direktno na oracle i napravio to sto su od mene trazili ali problem je sto moram da imam file sa sVim statementima koje sam koristio. A to je sad nemoguce jer sam u oracle server-u radio statement po statement. Tako da cu morati da odradim opet sve iz pocetka. Voleo bih neku platformu sa dobrim vizualnim prikazom koji pojednostavlja i ubrzava rad.

hVALA
 
Ako vec imas server na koji se kacis, sto ne koristis Oraclov SQL Developer, radi Windowsu i na Linuxu, dzabe je i ne instalira se? Imas vise tabova na kojima nezavisno radis, izvrsava samo one statemente koji su selektovani, vidis report, rezultate pa i analize ako hoces.

Kada jednom podesis server, nema vise potrebe da koristis ista osim developera, ili ja masim pitanje?
 
ha, upravo ga skidam.. nego mi je nesto palo na pamet. Server koji ja koristim je ORACLE sqlplus, da li ima command koja moze da generate script is sqlplus-s?
 
Pitanje nije jasno formulisano.

Ti pišeš neki SQL kod - upite i PL/SQL procedure? Ne razumem šta podrazumevaš pod - "idem sa unix-a na oracle"?

SQL izvršavaš iz nekog sql klijenta.

Na Oracle serveru imaš sqlplus kojim možeš da se povežeš na bazu.

Od grafičkih Oracle klijenata imaš Oracle SQL Developer koji je besplatan i Quest Toad for Oracle koji se plaća ali je proporcionalno ceni i bolji. 🙂


edit: Sada vidim tvoj drugi post. Sqlplus je SQL klijent (kao što sam već rekao) koji stiže uz Oracle Client (koji je opet uključen u Oracle DB). SQL skriptove možeš da izvršavaš na sledeći način:

Kod:
sqlplus user/pass@SID   @ime_skripta.sql
 
Poslednja izmena:
ok, ajde malo vise detalje. uzgred, hvala na odgovorima.

zadatak mi je da se nakacim na skolski unix server i da u njemu napravim 3 file-a( jedan je kreiranje tabela, drugi insertation i treci za query) . Kad to napravim onda da execute te filove tako sto udjem iz unix-a u sqlplus. ex. @create problem je sto kod koji sam na napisao je imao greske kad sam ga pokrenuo i posto sam u sql svetu par dana, debuging mi je bio katastrofalan. onda sam resio da odradim ovaj zadatak direktno na sqlplusu tako sto sam pokretao statement, po statement. I to sad radi, sve je kreirano ali je problem sto meni treba "hard copy" coda koji ja ne znam kako da izvucem ( generisem) is sqlplus-a. Onda sam resio da se vratim onoj prvoj verziji i kreiram file u unix-u jer mi to treba. NADAM SE DA JE SAD JASNIJE
 
ok, to je da pokrenem execution file-a. ali kako da generisem file iz vec napravljene baze u sqlplus-u?
 
Jasno.

Napraviš sql skriptove koji sadrže komande koje želiš da izvršiš:


01-createTable.sql
Kod:
CREATE TABLE TEST_TABLE_01
(
  ROW_ID  NUMBER                                NOT NULL,
  DATA    VARCHAR2(64)                          NOT NULL
)
LOGGING 
NOCOMPRESS 
NOCACHE
NOPARALLEL
NOMONITORING;


ALTER TABLE TEST_TABLE_01 ADD (
  CONSTRAINT TEST_TABLE_01_PK
  PRIMARY KEY
  (ROW_ID));

COMMIT;
QUIT;

02-insertData.sql
Kod:
INSERT INTO TEST_TABLE_01 (ROW_ID, DATA) VALUES (1, 'Some random data');
INSERT INTO TEST_TABLE_01 (ROW_ID, DATA) VALUES (2, 'More random data');
INSERT INTO TEST_TABLE_01 (ROW_ID, DATA) VALUES (3, 'Eat all the cake!');
INSERT INTO TEST_TABLE_01 (ROW_ID, DATA) VALUES (4, 'The cake is a lie!');
INSERT INTO TEST_TABLE_01 (ROW_ID, DATA) VALUES (5, 'Even more random data');

COMMIT;
QUIT;

03-selectData.sql
Kod:
select * from TEST_TABLE_01
where data like '%cake%';

quit;

Kad si napravio ove fajlove izvršiš ih na sledeći način (recimo da ti se baza zove TESTDB, username: marko, password: euroband):

Kod:
sqlplus -S marko/euroband@TESTDB   @01-createTable.sql
sqlplus -S marko/euroband@TESTDB   @02-insertData.sql
sqlplus -S marko/euroband@TESTDB   @03-selectData.sql


ili ako si stavio sekvencijalne prefikse u imenima fajla (da bi bio siguran da se skriptovi izvršavaju pravilnim redosledom):

Kod:
for sqlFile in *sql; do echo $sqlFile; sqlplus -S marko/euroband@TESTDB @$sqlFile; done



edit:
Treba ti alat koji će generisati skriptove za kreiranje tabela i ostalih objekata na osnovu već kreiranih objekata i skriptove za insert podataka (isto na osnovu već postojećih tabela)? To je najlakše uraditi iz Toad-a.

Može i iz sqlplus-a: Za create objekata pogledaj help za dbms_metadata.get_ddl(). Za insert podataka - napraviš skript koji će generisati INSERT komande.
 
Poslednja izmena:
Pa koliko si to koda otkucao da ne mozes da ga otkucas ponovo?

Ne znam iz sqlplus kako je, jer ga nisam koristio, ali iz SQL Developera ti je generalno jednostavno. Desni klik na tabelu > Export, podesi sta sve zelis da ti se vidi i zapamti kao fajl. Dobices kompletan DDL i insert naredbe za sve redove, naravno ako si tako podesio u prethodnom koraku. Samo pazi, kada si ti unosio svoje naredbe DBMS je tu unosio razne optimizacije i on jos dodavao svog koda i dopunjavao sta je jos morao. Vrlo verovatno ces dobiti kao izlaz i deo tog koda. Tako da, pazi sta saljes kao domaci 😀 .
 
Poslednja izmena:
Slazem se u potpunosti sa predhodim postom. To je sto mi treba. Ali iskreno mislim da nisam u stanju da to odradim na ovaj nacin. POMANJKANJE ISKUSTVA 🙂

Jel mozete da mi razjasnite ovo. Kada sam kreirao file koji pravi table, pokrenuo sam ga u sqlplus-u i pojavile su se greske. Ja sam to pokusao da ispravim i kada sam ponovo pokrenuo sam create.sql javile su se nove greske ( the name is already in use bla bla) trebalo mi je vremena da ukapiram da je to u stvari zbog toga sto sam ja tu neku tablelu vec napravio kada sam prvi put pokrenuo create.sql. Kako da izbegnem ovo?
mislim da bi najbolje bilo da zalepim ovde moj code i da ga pogledate, vrlo je kratak tako da bi mi to znacilo.
 
Možeš na početku skripta da obrišeš sve tabele koji si pravio (ako je cilj samo pokazna vežba kreiranja tabela).

Daj kod.
 
Ako si imao vise kreiranja tabela u fajlu, one tabele za koje je definicija bila ispravna (sintaksno) su se kreirale, one druge nisu. Kad ponovo pokusas da izvrsis fajl, verovatno nece proci sve. Koliko sam ja uspeo na kratko da vidim o sqlplus, on ne prekida kada naidje na gresku, nego samo produzava dalje kroz skriptu.

Zalepi kod.
 
Da, za razliku od sql loadera, sqlplus nema maksimalan broj grešaka. Jednostavno izvršiće svaki statement iz fajla i prijaviće ORA greške ako ih ima.
 
create table RecCenterMember(
id int not null primary key,
f_name varchar(20) not null,
l_name varchar(20) not null,
DOB varchar(12) not null,
family_id int);
FOREIGN KEY (family_id) references Family_Package(id);

create table Class
(
id int primary key not null,
title varchar (30) not null,
type varchar (30) not null,
instructor varchar(25) not null,
season varchar (12) not null,
year int not null,
FOREIGN KEY(type) references Class_Type(Type),
FOREIGN KEY(instructor) references Instructor(id));

create table Instructor
( id int primary key not null,
f_name varchar(25) not null,
l_name varchar(30) not null,
member_id int,
FOREIGN KEY (member_id) references RecCenterMember(id));

create table Class_Type
( type varchar(20) not null primary key,
description varchar(80) not null);

create table Family_Package
( id int not null primary key,
address varchar(40) not null,
phone varchar(20) not null unique);


create table Enrollment
( class_id int primary key not null,
member_id int not null unique,
cost in not null,
FOREIGN KEY(member_id) references RecCenterMember(id),
FOREIGN KEY(class_id) references Class(id));
 
Imas problem kod prve tabele, redosled zagrada ti nije ok. Zatvaras zagradu create table naredbe pre foreign key. Ako zelis da ti to ide u posebnom bloku onda ide ALTER TABLE <tabela> ADD CONSTRAINT <id constrainta> FOREIGN KEY <strani kljuc u tabeli> REFERENCES tabelaKojuReferenciras(imeKolone) .

Kod primary key ne moras da pises not null, to se podrazumeva. Ovo ostalo deluje ok.

Pazi samo da ne stvoris neku ciklicnu zavisnost pri kreiranju svega ovoga tj. da ti se desi da ne mozes da ubacis podatke u jednu tabelu, jer ne postoji odgovarajuci strani kljucevi u tabeli koju referenciraju, a u tu drugu ne mozes jer ne postoji u nekoj treci itd. Zapravo, to ti je verovatno problem i pri kreiranju tabela. Ako budes odmah hteo kod svake tabele da referenciras neku drugu, onda ona mora da postoji. Sto znaci da moras da kreiras tabele bez ikakvih stranih kljuceva, i kada su sve kreirane, onda dodaj kljuceve. Ili napravi neki plan po kojima ces, ali svakako da neces moci sve strane kljuceve odjednom da dodas, vec neke naknadno.
 
Poslednja izmena:
imam problem da izbrisem databases sa servera, kaze mi da je zbog relacija.. probao sam nekoliko nacina da uradim force drop ali nisam uspeo. znaci treba da izbrisem sve tabele koje sam napravio u oraclu, direktno.
 
Ispravljen kod:

Kod:
CREATE TABLE Family_Package
(
   id        INT NOT NULL PRIMARY KEY,
   address   VARCHAR (40) NOT NULL,
   phone     VARCHAR (20) NOT NULL UNIQUE
);

CREATE TABLE Class_Type
(
   TYPE          VARCHAR (30) NOT NULL PRIMARY KEY,
   description   VARCHAR (80) NOT NULL
);

CREATE TABLE RecCenterMember
(
   id          INT NOT NULL PRIMARY KEY,
   f_name      VARCHAR (20) NOT NULL,
   l_name      VARCHAR (20) NOT NULL,
   DOB         VARCHAR (12) NOT NULL,
   family_id   INT,
   FOREIGN KEY (family_id) REFERENCES Family_Package (id)
);

CREATE TABLE Instructor
(
   id          NUMBER PRIMARY KEY NOT NULL,
   f_name      VARCHAR (25) NOT NULL,
   l_name      VARCHAR (30) NOT NULL,
   member_id   INT,
   FOREIGN KEY (member_id) REFERENCES RecCenterMember (id)
);

CREATE TABLE Class
(
   id           NUMBER PRIMARY KEY NOT NULL,
   title        VARCHAR (30) NOT NULL,
   TYPE         VARCHAR (30) NOT NULL,
   instructor   NUMBER (25) NOT NULL,
   season       VARCHAR (12) NOT NULL,
   year         INT NOT NULL,
   FOREIGN KEY (TYPE) REFERENCES Class_Type (TYPE),
   FOREIGN KEY (instructor) REFERENCES Instructor (id)
);

CREATE TABLE Enrollment
(
   class_id    NUMBER PRIMARY KEY NOT NULL,
   member_id   NUMBER NOT NULL UNIQUE,
   cost        NUMBER NOT NULL,
   FOREIGN KEY (member_id) REFERENCES RecCenterMember (id),
   FOREIGN KEY (class_id) REFERENCES Class (id)
);

Kao što ti je WebWolf rekao imao si problem sa redosledom kreiranja tabela i foreign ključeva. Tj. pokušavao si da kreiraš tabelu koja ima foreign ključ iz neke druge tabele koja još uvek nije kreirana. Izmenio sam redosled kreiranja tabela tako da zadovoljava zahteve za foreign ključevima.

Imao si sintaksnu grešku pri kreiranju prve tabele - FOREIGN KEY se nalazio van CREATE statement-a.

Na nekoliko mesta ti se nije slagao tip foreign ključa sa tipom kolone u tabeli.

Kolona cost iz Enrollment tabele nije imala tip.

Koliko se sećam to su sve izmene. SQL sada može da se izvrši bez grešaka.
 
Poslednja izmena:
imam problem da izbrisem databases sa servera, kaze mi da je zbog relacija.. probao sam nekoliko nacina da uradim force drop ali nisam uspeo. znaci treba da izbrisem sve tabele koje sam napravio u oraclu, direktno.

Da bi obrisao ove tabele koje si napravio:

Kod:
DROP TABLE CLASS            CASCADE CONSTRAINTS;
DROP TABLE CLASS_TYPE       CASCADE CONSTRAINTS;
DROP TABLE ENROLLMENT       CASCADE CONSTRAINTS;
DROP TABLE FAMILY_PACKAGE   CASCADE CONSTRAINTS;
DROP TABLE INSTRUCTOR       CASCADE CONSTRAINTS;
DROP TABLE RECCENTERMEMBER  CASCADE CONSTRAINTS;
 
nable su napravljene, sad treba da unesem podatke. evo sta sam uradio. napravio sam insert.sql file i dodao sve sta je trebalo ali imam problema sa nekim od unosa. ovako u sustini izgleda moj insertation code za svaku tablu ponaosob:

insert into RecCenterMember values (3,'April','O Shea',6/23/1954,2);

insert into Class values(2, 'Photography', 'Art', 1, 'Fall', 2008);

insert into Instructor values( 3,'James', 'Robertson', null);

insert into Class_Type values('Art', 'Painting, sculpting,ect');

insert into Family_Package (2, '4940 Dickens Ave Chicago IL','312-555-9403');

insert into Enrollment values (4,10,30);

neki row-a su u redu ali vecina nije. Ne mogu da provalim sta nije u redu. Mislim da je jedan od problema sto sam datum 3/2/1982 stavio kao varchar..
 
Datum u prvom insertu ti je po definiciji u tabeli varchar2, tako da u insertu moraš da staviš '6/23/1954'. Ako hoćeš da u tabeli čuvaš datum (što ti preporučujem) promeni kolonu u DATE i datum unesi kao to_date('2012-01-31', 'yyyy-mm-dd').

U ostalim insertima imaš problem sa constraint-ima (foreign key-jevima). Pokušavaš da ubaciš podatke za koje ne postoje odgovarajući podaci u drugim tabelama. Podatke u tabele ubacuj onim redosledom kojim se tabele kreiraju u skriptu koji sam okačio.
 
datum sam prepravio ali opet nece. I raspored insertation-a kad promenim ( u skladu sam create) opet nece.. Vidim da me constraint zez i da nije dobro napravljen.. uh umoran sam vise...
 
Kod:
insert into Family_Package values (2, '4940 Dickens Ave Chicago IL','312-555-9403');
insert into Class_Type values('Art', 'Painting, sculpting, ect');
insert into RecCenterMember values (3,'April','O Shea','6/23/1954',2);
insert into Instructor values(3,'James', 'Robertson', null);
insert into Class values(1, 'Photography', 'Art', 3, 'Fall', 2008);
insert into Enrollment values (1, 3, 100.00);

commit;

Ako u tabeli promeniš tip polja u DATE onda će ti insert izgledati ovako:

Kod:
insert into RecCenterMember values (3,'April','O Shea', to_date('1954-06-23', 'yyyy-mm-dd'), 2);

Moraš da paziš da imaš dobre vrednosti za sve foreign ključeve. Znači ako definišeš dva instruktora sa Instructor.ID = 1, i ID = 2, u Class tabeli u koloni instructor smeš da koristiš samo ove vrednosti. Tome inače i služe constraint-i - da obezbede integritet podataka.

Dizajn tabela ti u principu nije dobar (loše su ti povezani podaci). Recimo Class treba da ima ClassTypeID kolonu i ona treba da odgovara ID koloni iz ClassType tabele. Instructor ima ID jednog membera, a jedan instruktor može da bude vezan za više membera u preko Enrollment - Class.

Trudi se da odrediš sebi pravila i da ih poštuješ u dizajnu tako da na kraju dobiješ konzistenat layout.

Recimo odrediš da ti jedan entitet uvek ima ID.
Prepoznaš šta su:
- Objekti (instruktor, član),
- property tj. osobina koju dodeljuješ nekom objektu (class_type, ...)
- relacije između objekata (Enrollment, itd...).

Kao foreign key uvek uzimaš taj ID i ništa drugo.
 
Poslednja izmena:
Jedan savet, ovako sa strane. Ne znam da li ste izucili bar do neke mere EER (enhanced entity relationship) ili bar UML model. Meni je znacajno lakse da napravim semu iole vece baze kada imam EER ispred sebe i bio mi je dragocen u prvim koracima. Generalno, na njemu odmah vidis zavisnosti i redoslede unosenja, pa i nekoegzistentnosti u imenovanju kolona i tabela. Ako pogledas sliku i ne znas cemu sluzi na osnovu imena, znas da ne valja 😀 . Videces nelogicnosti u dizajnu i referenciranju kao i mesta na kojima ces moci da izvrsis neko izvodjenje ili generalizaciju, stvari koje ces verovatno kasnije vidjati dok budes ucio o bazama.
 
Nazad
Vrh Dno