Konačno OCP DBA 11g !

Thursday, 24.05.2012 – Dejan

Nakon višemjesečnog (da ne kažem višegodišnjeg) odugovlačenja, konačno sam se nakanio polagati ispit za upgrade na 11g (1Z0-050: “Oracle 11g Database: New features for Administrators”). Sa zadovoljstvom mogu reći da sam ga uspješno položio i od danas u kolekciji sertifikata imam i OCP DBA 11g.

Pitanja ne da su bila teška, nego nemoguća! Moram priznati da sam na nekoliko pitanja blefirao odgovor, jer pojma nisam imao 🙂

Idući korak – OCM 11g. Odslušao sam već jedan kurs (Oracle 11g: Real Application Cluster), a za mjesec dana slijedi drugi, pa ako se sve poklopi, mogao bih tamo negdje na jesen ili na proljeće iduće godine polagati i taj ispit…


Expert seminari: Tom Kyte u Beogradu; Jonathan Lewis u Zagrebu !

Saturday, 28.04.2012 – Dejan

Pošto sam ja veliki pobornik i zagovornik kontinuiranog i specijalističkog usavršavanja, prenosim vam informaciju, da Jonathan Lewis 07. i 08.05.2012.  ima dvodnevni seminar u Zagrebu – “Writing optimal SQL / Database Troubleshooting“, dok Tom Kyte drži predavanje 15. i 16.05.2012. u Beogradu – “Ask Tom Live: A 2-day live seminar with Tom Kyte”.

Ugnjavite vaše šefove, da vam plate te seminare, jer će vam se višestruko isplatiti !!!

Pošto sam ja već odslušao ovaj seminar od Toma, idem na seminar od Jonathana Lewisa u Zagreb. Ko je zainteresovan za druženje, pivu i sl., nek se javi !!!


Prepisujte, ali barem navedite izvor informacija

Sunday, 23.10.2011 – Dejan

Naletih slučajno na neki seminarski rad sa temom “Vođenje evidencije materijalno knjigovodstvo“, kad u njemu bukvalno prekopirani dijelovi tekstova objavljenih ovdje na blogu “Baze podataka”.

Pogledajte pažljivije poglavlje “2. Instalacija CASE alata”, a potom i ostala, i uočite maltene identičan tekst na puno mjesta, npr. usporedite ga sa  originalnim tekstom “Oracle XE: kako započeti sa Oracleom“.

Samo da pojasnim – veoma mi je drago, što tekstovi sa ovog bloga nekome koriste, jer tekstovi i jesu pisani sa tom namjerom, ali mi je krivo što autori ovog seminarskog rada u popisu literature, koju su koristili, nisu naveli i ovaj blog kao izvor informacija…

Nadam se da su ti studenti dobili najvišu ocjenu, ali poručujem ipak svima – prepisujte, ali barem navedite izvor informacija.


Nagradni SQL zadatak: uklanjanje preklapajućih filtera

Friday, 21.10.2011 – Dejan

E dragi moji SQLovci, došao sam na ideju da vam ponudim jedan nagradni SQL zadatak. Radi se o jednom zadatku, sa kojim sam se susreo na poslu, a smatram ga veoma zanimljivim i interesantnim za razbuđivanje moždanih vijuga. 🙂

Postaviću vam zadatak, a najbolje rješenje će biti nagrađeno knjigom po izboru sa Amazona u vrijednosti do 50 EUR i biće objavljeno ovdje na blogu. Rješenje možete slati putem e-maila (dejan@) ili ostaviti kao komentar ispod teksta. Najbolje rješenje je ono, koje se najbrže izvrši – dakle, nebitno je koje ćete metode koristiti. Jedini uslov je da rezultat bude odrađen SQL upitom – nije dozvoljeno korištenje PL/SQL-a ili nekog drugog prog. jezika – samo SQL!

Opis zadatka

– imamo tabelu FILTER_CRITERIAS sa testnim podacima (za kreiranje tabele i unos potrebnih podataka, pokrenite ovu skriptu – insert_filter_criterias.sql )

– u tabeli se nalaze slijedeće kolone:

  1. ID – ključ za određenu grupu filtera
  2. NUMBER_KEY – filter za brojeve
  3. STRING_KEY – filter za stringove
  4. SERIES – filter za serijsku oznaku
  5. FIELD – filter za neko malo polje
  6. TEXT_ITEM – filter za neko veće tekstualno polje

– svaka grupa filtera je određena svojim ključem (ID)
– kombinacija svih filtera u jednom redu neke grupe zajednički čine tzv. kombi-filter, znači NUMBER_KEY, STRING_KEY, SERIES, FIELD i TEXT_ITEM zajedno čine jedan kombi-filter
– kombi-filter iz tabele FILTER_CRITERIAS se koristi u WHERE klauzuli nekog SQL upita, u kojem se vrijednosti iz neke tabele uspoređuju sa filterom
– e sad, pošto je moguće, da se određeni kombi-filteri preklapaju, zbog čega se dobijaju dupli redovi iz ciljne tabele, onda se kombi-filteri moraju svesti na najmanji mogući djelilac kao npr. kod skraćivanja razlomaka. Npr. ako je filter STRING_KEY prazan, tj. NULL, onda je on non-greedy i  pokriva više slučajeva u odnosu na slučaj kada za STRING_KEY imamo npr. ‘DUMMY’, koji je više greedy: LIKE ‘%’ pokriva sve, a LIKE ‘DUMMY%’ samo stringove, koji počinju sa DUMMY. Isto važi i za ostale filtere. Da bih vam dočarao šta zapravo želim postići, prikazaću u tablici trenutne podatke, te redove, koji se preklapaju i kako bi trebao izgledati konačan rezultat.

Raw filter podaci

Raw filter podaci

Zeleni redovi sadrže kombi-filter, koji isključuje preklapajuće kombi-filtere u istoj grupi

good_and_bad_rows

Ovako bi trebao da izgleda konačan rezultat

only_good_rows

Nadam se da je jasan cilj ovog zadatka, a ako je nešto nejasno, možete ostaviti komentar ispod teksta ili poslati mi e-mail.

Konačni rok za slanje rješenja je 20.11.2011., nakon čega će uslijediti odabir i proglašenje najboljeg rješenja.

Eto, pa da vidimo ko je najbolji SQLovac. 🙂


Oracle: Explain the Explain Plan

Thursday, 20.10.2011 – Dejan

Zanimljivo je da mnogo Oracle programera niti nakon nekoliko godina rada sa SQL-om i PL/SQL-om ne znaju pravilno da tumace “Explain Plan” prikaz.

Da se ja ne bih mucio, evo jedan dokument na tu temu, koji vrlo dobro opisuje prikaz “Explain Plan“.


Malo slozeniji CHECK constraint

Monday, 22.08.2011 – Zidar

 

 

 

Kad govorimo o projektovanju baze podataka, nekako uvek mislimo na to kako postaviti tabele i veze izmedju njih. Govoreci SQL jeziokom, oslanjamo se uglavnom na FOREIGN KEY ogranicenja. Cesto zaboravljamo da postoje i druga ogranicenja koja daju isti efekat a ponekad pojednostavljuju konacno resenja. Pokazacemo na jednom primeru kako se moze upotrebiti CHECK constraint umesto FOREIGN KEY, kao i  kako se ista situacija razresava na ‘klasican nacin’ – upotrebo FOREIGN KEY ogranicenja.

Recimo da imamo tabelu Kupci, gde cuvamo podatke – o kupcima. Kupaca imamo dve vrste, pravna i fizicka lica. Pravna lica (preduzeca) imaju jednu vrstu identifikaciong broja, a fizicka lica imaju maticni broj gradjana. ID broj za pravna lica je osmocifreni broj, a maticni broj ima 18 cifara. Krenimo od ovakvog resenja:

IF OBject_ID(‘Kupci’) IS NOT NULL DROP TABLE Kupci

;

CREATE TABLE Kupci

(

  KupacID varchar(12) NOT NULL PRIMARY KEY

, ImeKUPCA varchar(50) NOT NULL

, CONSTRAINT KupacID_samo_cifre CHECK (KupacID NOT LIKE ‘%[^0-9]%’)

, CONSTRAINT KupacID_Duzina CHECK (LEN (KupaciD) = 8 OR LEN(KupacID) = 18)

)

;

Zanemarimo za trenutak cinjenicu da smo u jednu kolonu strpali dve razlicite stvari. ID preduzeca i maticni broj gradjana nisu isto te smo time smo pravilo 1NF. Molim da zanemarite ovu cinjenicu. Nesto drugo zelimo da pokazemo.

Postavili smo ogranicenje da se u varchar kolonu mogu uneti samo cifre. Takodje smo ogranicili duzinu KupacID na 8 ili 18 karaktera, ili ili, ostale duzine nisu dozvoljene.

Da vidimo sta nismo pokrili ogranicenjima. Nista nas sprecava da za pravno lice unesemo 18 cifara a za fizicko lice 8 cifara. Pokusajmo da unesemo nekoliko redova. Prva dve komande padaju, zbog CHECK ogranicenja. Druge dve prolaze, i treba da prodju. Poslednje dve prolaze, a ne treba da prodju. Kompanija Big Brother Co, prolazi sa maticnim brojem gradjana, a gradjanin Donald Duck prolazi sa id brojem preduzeca.

INSERT INTO Kupci VALUES (‘1XX23’,‘KUpac A’);

INSERT INTO Kupci VALUES (‘123’,‘Export-Import Co’);

 

INSERT INTO Kupci VALUES (‘12345678’,‘Export-Import Co’);

INSERT INTO Kupci VALUES (‘123456789012345678’,‘Marko Markovic’);

 

INSERT INTO Kupci VALUES (‘987654321012345678’,‘Big Brother Co.’);

INSERT INTO Kupci VALUES (‘87654321’,‘Donald Duck’);

Zato bi trebalo da znamo koji kupac je pravno a  koji je fizicko lice. Dodajmo kolonu za novi podatak.

IF OBject_ID(‘Kupci’) IS NOT NULL DROP TABLE Kupci

;

CREATE TABLE Kupci

(

  KupacID varchar(18) NOT NULL PRIMARY KEY

, ImeKUPCA varchar(50) NOT NULL

, TipKupca    char(1) NOT NULL CHECK ( TipKupca   IN (‘P’,‘F’))

, CONSTRAINT KupacID_samo_cifre CHECK (KupacID NOT LIKE ‘%[^0-9]%’)

, CONSTRAINT KupacID_Duzina CHECK (LEN (KupaciD) = 8 OR LEN(KupacID) = 18)

)

;

Sva ogranicenja iz prvog pokusaja i dalje vaze, ali sad mozemo da idemo dalje. Sada imamo dve kolone koje su medjusobno zavisne. Ako je TipKupca = ‘P’ onda KupacID ima 8 cifara. Ako je TipKupca = ‘F’ onda KupacID ima 18 cifara. Sve ostalo nije dozvoljeno. Imamo dve varijable, a =TipKupca i b = LEN(KupacID), sa po dve moguce vrednosti. To nam daje 4 moguce kombinacije, od kojih su neke tacne a neke ne. Napravimo tablicu:

a=TipKupca

b=LEN(KupacID)

Rezultat

P

8

Dozvoljeno

P

18

Nije dozvoljeno

F

8

Nije Dozvoljeno

F

18

Dozvoljeno

 

Od cetiri kombinacije, dve su dozvoljene a dve nisu. Ogranicenje bi se moglo napisati ovako:

ALTER TABLE Kupci

ADD CONSTRAINT KupacID_Duzina_PF

CHECK (1 =

      CASE

            WHEN TipKupca = ‘P’ AND LEN(KupacID) = 8 THEN 1

            WHEN TipKupca = ‘P’ AND LEN(KupacID) = 18 THEN 0

            WHEN TipKupca = ‘F’ AND LEN(KupacID) = 8 THEN 0

            WHEN TipKupca = ‘F’ AND LEN(KupacID) = 18 THEN 1     

      END

      )

;

Testirajmo sada tabelu:

INSERT INTO Kupci VALUES (‘1XX23’,‘KUpac A’,‘P’);

INSERT INTO Kupci VALUES (‘123’,‘Export-Import Co’,‘F’);

 

INSERT INTO Kupci VALUES (‘12345678’,‘Export-Import Co’,‘P’);

INSERT INTO Kupci VALUES (‘123456789012345678’,‘Marko Markovic’,‘F’);

 

INSERT INTO Kupci VALUES (‘987654321012345678’,‘Big Brother Co.’,‘P’);

INSERT INTO Kupci VALUES (‘87654321’,‘Donald Duck’,‘F’);

 

Prve dve komande padaju, iz istog razloga kao i pre. Druge dve prolaze. Trece dve ne prolaze, zbog dodatnog uslova. Upotreba CASE funkcije u CHECK uslovu omogucila nam je da bolje kontrolisemo ulazne podatke. Zbog jednostavnosti postavili smo uslov po duzini niske karaktera a u realnosti mogli smo da ukljucimo sta god hocemo, pa cak i pozivanje korisnickih funkcija. Ako ste ikad napisali korisnicku funkciju koja proverava maticni broj gradjana, mozete je upotrebiti  i ovde.

Sigurno je neko primetio da se zadatak moze resiti tipizacijom – razbijanjem tabele Kupci na vise tabela. Imali bismo tri tabele, Kupci, Kupci_P, Kupci_F. Tabele Kupci_P i Kupci_F sluze da razdvojimo tabelu Kupci na dva tipa, pravna i fizicka lica. Tabele Kupci_P i Kupci_F  nazvacemo ‘subtip tabele’. Za svaku od subtip tabela morali smo da definisemo ceo skup ogranicenja.

IF OBject_ID(‘Kupci_F’) IS NOT NULL DROP TABLE Kupci_F

;

IF OBject_ID(‘Kupci_P’) IS NOT NULL DROP TABLE Kupci_P

;

IF OBject_ID(‘Kupci’) IS NOT NULL DROP TABLE Kupci

;

CREATE TABLE Kupci

(

  KupacID int NOT NULL PRIMARY KEY

, ImeKUPCA varchar(50) NOT NULL

, TipKupca    char(1) NOT NULL CHECK ( TipKupca   IN (‘P’,‘F’))

, UNIQUE (KupacID, TipKupca)

)

;

CREATE TABLE Kupci_P

(  KupacID int NOT NULL UNIQUE

, TipKupca char(1) NOT NULL CHECK (TipKupca = ‘P’)

, BrojPreduzeca char(8) NOT NULL PRIMARY KEY

, CHECK (BrojPreduzeca NOT LIKE ‘%[^0-9]%’)

, CHECK (LEN (KupaciD) = 8)

, CONSTRAINT fk_Kupci_P 

      FOREIGN KEY (KupacID, TipKupca)

            REFERENCES Kupci (KupacID, TipKupca)

)

;

CREATE TABLE Kupci_F

( 

      KupacID int NOT NULL PRIMARY KEY

      , TipKupca char(1) NOT NULL CHECK (TipKupca = ‘F’)

      , MaticniBroj char(8) NOT NULL UNIQUE

      , CHECK (MaticniBroj NOT LIKE ‘%[^0-9]%’)

      , CHECK (LEN (KupaciD) = 18)

      , CONSTRAINT fk_Kupci_F 

            FOREIGN KEY (KupacID, TipKupca)

                  REFERENCES Kupci (KupacID, TipKupca)

)

;

Primetite da je tip kupca ponovljen u subtip tabelama. Ovo je vazno jer neke knjige ne pominju da se tip entitete prenosi u subtip tabele. Tip kupca u tabeli kupci mora da se slaze sa tipom kupca u subtip tabelama. U subtip tabelama tip moze imati tacno jednu vrednost. Ovo sprecava da istog kupca upisemo u dve subtip tabele.

Metod sa subtipovima jeste relaciono ispravniji. Nema mesanja dve vrste podataka u istoj kolni. Medjutim, uvek postoji sansa da se u tabelu Kupci unese kupac, a da iz nekog razloga ne prenesemo kupca u subtip tabelu.  Ima razlike i u pisanju kverija. Ako imate jednu tabelu, lako je povuci sve kupce iz nje. Sa tri tabele, pokusajte da ispisete sve kupce i njihove ID brojeve. Sta je jednostavnije:

SELECT * FROM Kupci     — metod jedne tabele

ili

— metod tri tabele

SELECT

  K.KupacID

, K.ImeKUPCA

, K.TipKupca

, BrojKupca = COALESCE (P.BrojPreduzeca, K.MaticniBroj)

LEFT JOIN Kupci_P AS P ON P.KupacID = K.KupacID

LEFt JOIN Kupci_F AS F ON F.KUpacID = K.KupacID

U metodu tri tabele imate KupacID i BrojKupca. Koja od te dve vrednosti u stvari odredjuej kupca?

Ispada da ponekad malkice denormalizacije moze biti i korisna stvar. Uz uslov da postavite sva potrebna ogranicenja.

Ima situacija kada se absolutno mora pribeci podtipovima. U nasem primeru subtip tabele imaju identicnu strukturu. Nije uvek tako. Ako bi za fizcka lica cuvali datum rodjena a za preduzeca ime direktora ili osobu za kontakt, onda nam ne ginu tri tabele. I tada bi mogli da koristimo jednu tabelu i napisemo uslove za validaciju nekolko kolona, ali bi to bilo mnogo komplikovanije nego u nasem primeru.

 

 

 


Apex 4.1 – prva najava

Wednesday, 15.12.2010 – mradovan

Nedavno je objavljena informacija da se Apex 4.1 očekuje u idućoj kalendarskoj godini, nadam se čim prije. Lista novih mogućnosti buduće verzije se sastoji od:

  • Mogućnost razvoja aplikacija za pametne mobilne uređaje – uključuje teme i predloške prilagođene pametnim uređajima i mobitelima;
  • Grafovi koji se renderiraju bez upotrebe Flash tehnologije, kako bi se mogli prikazivati na mobilnim uređajima;
  • Upravljanje greškama – poboljšani mehanizam upravljanja greškama i korisničkim iznimkama;
  • Mogućnost prikazivanja više IR (Interactive Report) regija na jednoj stranici, te podrška za pivot upite;
  • Mogućnost prikazivanja više tabularnim formi na jednoj stranici i proširene mogućnosti validacije na formi;
  • Podrška za Master-Detail-Detail prikaze;
  • Poboljšane mogućnosti Dynamic Actions i njihova primjena na tabularne forme, reporte i gumbe;
  • Poboljšana podrška za pluginove;
  • Mogućnost korištenja ROWID za automatsko procesiranje redaka (Automatic DML);
  • Modalni dijalozi koji će se prikazivati na vrhu stranice, dok će ostatak stranice biti zasivljen;
  • Poboljšani Websheets – veća kontrola korisničkog sučelja, novi tipovi sekcija na stranici i poboljšane mogućnosti integracije tablica;
  • Data Upload – mogućnost uploada podataka u tablicu u bazi podataka kroz aplikaciju;
  • Poboljšane postojeće teme i predlošci;
  • Razne druge funkcionalnosti i poboljšanja performansi;

Moram priznati da mi se ovo jako sviđa, i da jedva čekam da bude javno objavljena. Također, moja pretpostavka je da će nova verzija APEX-a izaći usporedno i sa novom Oracle 11g XE besplatnom bazom podataka, koja će doći s već ugrađenom APEX 4.1  verzijom, a navodno će podržavati skup podataka od 10 GB nasuprot 4GB u trenutnoj XE 10g verziji, i vjerojatno bolje riješena pitanja sigurnosti i ograničenja hardvera.


Brzi upit za provjeru postojanja retka u tablici

Sunday, 21.11.2010 – msutic

Evo i mene sa blog postom nakon dugo vremena. Ovaj tjedan sam po prvi puta upoznao Dejana (u živo) koji se našao u Zagrebu zbog naprednog Oracle tečaja. Moram reći da sam uživao u razgovoru i nadam se da neće proći puno do iduće pive, ako ne u Zagrebu onda u Beču 🙂

Što se tiče mojih budućih postova, to će uglavnom biti tekstovi sa bloga kojeg vodim na engleskom jeziku „http://msutic.blogspot.com“. Ovdje će se nalazit hrvatska verzija tekstova za sve one koji se ne snalaze najbolje u engleskom jeziku.

Pa krenimo sa današnjim postom…

Jedna od bitnih stavki u poslu administratora baza podataka je i pronalaženje neefikasnog koda te podešavanje istog. Za sebe mogu reći da često puta znam pregledati skupe upite koji se u tom trenutku vrte na bazi i uvijek pokušam naći efikasnije rješenje ukoliko je to moguće.

Nekoliko puta sam do sad primijetio da programeri provjeravaju postojanje retka u tablici na način da izbroje koliko se puta navedeni zapis pojavio u tablici i ako je ta vrijednost veća od 0 redak postoji.

declare
l_cnt number;
begin
select count(*) into l_cnt
from test_table
where row = something;
if l_cnt>0 then
exists, do something
else
not exists, do something
end if;
end;
/

Upit će dati točan rezultat na pitanje postoji li traženi redak u tablici ali će do odgovora doći na vrlo neefikasan način. Da bi se izbrojao broj pojavljivanja retka svaki puta će se pretražiti cijela tablica što bi mogao biti problem ukoliko se radi o većoj tablici.

Puno efikasniji je način da upit završi sa izvršavanjem čim naiđe na prvo pojavljivanje retka koji tražimo. Prebrojavanje koliko se puta pojavio taj retak u tablici je jednostavno nepotrebno i značajno produžava vrijeme izvršavanja koje bi najčešće trebalo biti vrlo kratko.

Postoji nekoliko načina na koji se efikasno može napisati navedeni upit, te ću ja ovdje zapisati neke od njih.

Testno okruženje:
Oracle Enterprise Linux 5
Oracle 10.2.0.4.0

Kreirajte jednostavnu tablicu bez indeksa i napunite ju sa 2000000 redaka.

drop table testtab;

create table testtab (id number,
code number,
text varchar2(50),
tdate date);

Table created.

insert /*+ append */ into testtab
select rownum, mod(rownum,1000), rpad('x',50,'x'), sysdate+rownum
from all_objects o1,
all_objects o2
where
rownum <= 2000000
/
commit;
Commit complete.

U ovom testu ću provjeravati postojanje retka sa kodom 999.

Prvo rješenje:

set timing on
alter system flush buffer_cache;
System altered.

declare
l_cnt number;
begin
select count(*) into l_cnt
from testtab
where code=999;
if l_cnt>0 then
dbms_output.put_line('Exists!');
else
dbms_output.put_line('NOT Exists!');
end if;
end;
/

Exists!

PL/SQL procedure successfully completed.
Elapsed: 00:00:04.32

U ovom slučaju sam potrošio više od 4 sekunde za provjeru postojanja navedenog retka u tablici.

Drugo rješenje:

set timing on
alter system flush buffer_cache;

System altered.

declare
l_cnt number;
begin
select count(*) into l_cnt
from dual
where exists (select code
from testtab
where code=999);
if l_cnt>0 then
dbms_output.put_line('Exists!');
else
dbms_output.put_line('NOT Exists!');
end if;
end;
/

Exists!

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.07

Već ovdje možete primijetiti značajno poboljšanje pri izvršavanju upita.
Provjera je trajala samo 00,07 sekundi!
Ovo je inače način provjere koji ja najčešće volim koristiti za provjeru postojanja retka u tablici – upit završava sa izvršavanjem čim pogodi prvi traženi redak.

Treće rješenje:

set timing on
alter system flush buffer_cache;

System altered.

declare
l_cnt number;
begin
select count(*) into l_cnt
from testtab
where code = 999
and rownum = 1;
if l_cnt>0 then
dbms_output.put_line('Exists!');
else
dbms_output.put_line('NOT Exists!');
end if;
end;
/

Exists!

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.06

Ovaj put sam izvršavanje ubrzao koristeći rownum=1 unutar upita. Rezultat će se ispisati nakon pronalaska prvog odgovarajućeg retka.

Četvrto riješenje:

set timing on
alter system flush buffer_cache;
System altered.

begin
for x in (select count(*) cnt
from dual
where exists (select NULL from testtab
where code=999))
loop
if (x.cnt = 1)
then
dbms_output.put_line('Exists!');
else
dbms_output.put_line('NOT Exists!');
end if;
end loop;
end;
/

Exists!

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.07

Ovo sam rješenje našao na stranicama AskTom.

Peto rješenje:

set timing on
alter system flush buffer_cache;
System altered.

begin
for x in (select /*+ first_rows(1) */ count(*) cnt
from testtab
where code=999
and rownum < 2)
loop
if (x.cnt = 1)
then
dbms_output.put_line('Exists!');
else
dbms_output.put_line('NOT Exists!');
end if;
end loop;
end;
/

Exists!

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.06

Još jedno rješenje sa AskTom stranice.

Idući put kad budete morali provjeriti postojanje retka u tablici sjetite se ovog posta 😉


APEX 4.0 – nova generacija Oracleovog RAD alata

Friday, 19.11.2010 – mradovan

Prije par mjeseci javno je objavljena zadnja verzija APEX 4.0. Posljednji release koji možete skinuti je 4.0.1.00.03, dok se ovih dana očekuje patchset na verziju 4.0.2.00.05, koji možete koristiti online na apex.oracle.com.

Apex 3.2 je bio značajno poboljšanje u odnosu na prijašnje verzije, dok je 4.0 donio niz novih osvježenja, koja prvenstveno omogućuju brži razvoj web formi novim mogućnostima koje su do sad bile moguće samo uz korištenje JavaScript funkcija.

Prvenstveno mogu spomenuti DynamicActions, koji korištenjem napredne Ajax tehnologije omogućava interaktivno ponašanje objekata na formi bez osvježavanja stranice. Tako sad na određeni događaj na objektu možete inicirati sakrivanje ili pokazivanje (hide/show), omogućiti ili onemogućiti određeni objekt (enable/disable), dati mu određenu vrijednost (SetValue) i razne druge mogućnosti. Akcije vrijede ako je zadani uvjet ispunjen, a mogu se inicirati i pozivanje PL/SQL izraza i funkcija te pozivanje SQL koda, JavaScript koda isl.

Druga spomena vrijednosti mogućnost je kaskadno postavljanje vrijednosti u SelectList kontrolama, ali samo na formi, ne i u tabeli (ta mogućnost se očekuje u verziji 4.1). Nove vrste kontrola na formi su Number, poboljšani DatePicker, CheckBox te Popup Lov koji automatski vraća ID i skriva ga, a prikazuje ime, što do sad nije bilo moguće. U Tabular formi ta kontrola se zove Key Popup Lov.

Također, odlična stvar je mogućnost korištenja plugin-ova, kojima možete značajno unaprijediti izgled i ponašanje vaše aplikacije. Mnoštvo plugin-ova možete naći na stranici APEX-PLUGIN.COM, na koju se možete besplatno i registrirati, te raditi svoje pluginove i tamo ih objavljivati.

Velika novost je i TeamDevelopment, uz pomoć kojeg možete vršiti koordinaciju između developera, dizajnera, ali i krajnjih korisnika. Možete zadavati taskove, prijavljivati greške, objavljivati nove mogućnosti isl. U svojoj aplikaciji možete kreirati stranicu koja će služiti korisniku za prijavu greške, komentar ili zahtjev za poboljšanje (Feedback Page), a administrator i developeri koji imaju pristup TeamDevelopment dijelu mogu pratiti povratnu informaciju krajnjih korisnika, na koju se mogu i pretplatiti, te informacije dobivati na email.

Također, tu su nove i bolje teme, poboljšana interaktiv report forma, poboljšani grafovi koji sad mogu priikazivati gantove karte, i još mnogo drugih mogućnosti, a svaka od ovih mogućnosti je tema za sebe.

Ono što mogu iskreno reći, rad sa zadnjom verzijom APEX-a zaista je užitak!

**************************************************************************************************************************************************************

Ovo je moj treći članak na temu Oracle Apex, objavljen na hroapex.blogspot.com

**************************************************************************************************************************************************************


ORACLE APEX – Instalacija u 10 koraka

Wednesday, 17.11.2010 – mmilosevic

 

 Evo instalacionog uputstva za sve one koji žele da se pozabave Oracle APEX alatom. Na početku nekoliko generalnih napomena:

·  Ovde će biti prikazano uputstvo za instalaciju ORACLE APEX-a u Windows okruženju

·  Ovo je pojednostavljena verzija instalacije čiji je cilj da na što efikasniji način započnete priču o APEX-u. Sve detalje ćete naći u ORACLE dokumentaciji o instalaciji APEX-a koju možete videti ovde.

·  Podrazumeva se da ste se registrovali na ORACLE portalu i da možete skidati potrebne instalacije,

·  Podrazumeva se da ste prethodno instalirali Oracle XE bazu prema jednom od prethodnih uputstava.

 

 

Počnimo korak po korak:

1. Ovde se prvo složite sa licencnim uslovima a zatim download-ujte poslednju verziju Oracle Application Express, za sada je to 4.0.1 (može i samo sa engleskim jezikom ako vam to odgovara).

 

 

2. Otpakujte zip arhivu sa instalacijom npr. u folder C:\ashish. Generalna napomena kod instalacije bilo kog Oracle programa je da ne stavljate instalaciju u neki folder sa kilometarskom putanjom ili, još gore, sa putanjom koja sadrži naša slova jer se može desiti da instalacija uopšte ne krene i da vam Oracle prijavi grešku. Osim toga, lakše je prisupati neophodnim sql skriptama iz komandne linije, kad vam zatreba.

 

 

3. Pokrenite komandnu liniju Start>run>cmd ili kod novijih Windowsa samo Start>cmd.

 

 

4. Ako to prethodno niste uradili onda podesite sistemske promenjive za XE bazu (pretpostavka je da je XE instaliran u C:\oraclexe):

 

set ORACLE_HOME=c:\oraclexe\app\oracle\product\10.2.0\server

set ORACLE_SID=XE

set PATH=%ORACLE_HOME%\bin;%PATH%

 

Inače, neophodno je da ove promenjive podesite trajno u Advanced system settings>Environment Variables
(u Windows-u 7 to možete uraditi i sa SETX komandom).
Sada je potrebno da pređete u folder sa APEX instalacijom, dakle, u mom konkretnom slučaju u C:\ashish\apex. Sledi konekcija na XE bazu, otkucajte:

 

 

sqlplus “/ as sysdba”

 

 

Sve prethodno urađeno možete videti i na slici:

  

sl11

Slika 1.

 

5. Sada je potrebno pokrenuti instalacionu skriptu apexins.sql sa potrebnim parametrima. Pošto se već nalazite u folderu gde je instalaciona skripta, onda instalaciju započnite komandom:

 

@apexins SYSAUX SYSAUX TEMP /i/

 

sl2

Slika 2.

 

Instalacija će, u zavisnosti od vašeg računara, trajati do desetak minuta nakon čega bi trebalo da se ponovo pojavi komand prompt kao na slici:

 

 

sl32

Slika 3.

 

6. Kompletan tok instalacije se beleži u log fajl koji se snima u instalacioni folder u formatu <YYYY-MM-DD_HH24-MI-SS>.log tako da ga možete pregledati ako se eventualno javi greška (daleko bilo).

 

sl41

Slika 4.

 

7. Sada je potrebno učitati slike koje APEX koristi unutar XE baze. Ponovo se konektujte sa:

 

sqlplus “/ as sysdba”

 

a onda pokreni skriptu apxldimg.sql sa referenciranjem na folder u koji smo otpakovali instalaciju, u mom slučaju to je C:\ashish pa je komada:

 

@apxldimg c:\ashish

 

sl5

Slika 5.

 

ako se sve završi kako treba cmd prozor će izgledati ovako:

 

sl6

Slika 6.

kucajte exit za izlaz iz sqlplus-a.

 

8. Sledeći korak je promena šifre administratora APEX okruženja uz pomoć skripte apxxepwd.sql . Dakle, ponovo konekcija na bazu, a onda kucajte komandu:

 

@apxxepwd.sql

 

potom upišite vašu šifru slično kao na slici, ponovite je i, naravno, upamtite.

 

sl7

Slika 7.

 

Izađite iz sqlplus-a sa exit i sada već možete da odete u administratorski servis vašeg APEX-a, otvorite web browser i upišite: http://127.0.0.1:8080/apex/apex_admin trebalo bi da radi.

 

9. Ovaj korak realizujte ukoliko želite da vašem APEX-u pristupate kroz mrežu koristeći hostname i domen vašeg računara. Dakle, ponovo konekcija na bazu a zatim ukucajte komandu:

 

execute dbms_xdb.setListenerLocalAccess(l_access => FALSE) ;

 

sl8

Slika 8.

 

Sada administratorskom servisu možete pristupati i sa http://hostname.domain:8080/apex/apex_admin

gde hostname.domain predstavlja adekvatno ime i domen vašeg računara.

 

Za svaki slučaj, da ne bi došlo do zabune, ubuduće ću na slikama prikazivati pristup APEX-u preko lokalne adrese 127.0.0.1 (localhost adrese), što u prevodu znači da je APEX okruženje odsečeno od sveta.

 

10. Isključite crni prozor sa komandnom linijom, za sad vam ne treba, a onda u web browser ponovo ukucajte: http://127.0.0.1:8080/apex/apex_admin i logujte se kao admin sa vašom šifrom koju ste definisali u koraku 8.

 

sl9

 

Slika 9.

Međutim, biti administrator APEX-a nije mala stvar 😉 tako da administratorska šifra, ipak, mora da bude malo složenija, pa ćete je morati promeniti u skladu sa preporukama (šifra mora sadržati i velika i mala slova, broj i dopunske karaktere), a onda se vratiti sa RETURN na ponovno logovanje gde ćete se logovati kao admin ali ovog puta sa novom šifrom.

 

sl103

 

Slika 10.

 

Sada ulazite u administratorsko okruženje gde ćete se možda osećati kao Alisa u zemlju čuda, ali ne brinite, ovo nije vaše radno okruženje i ovde ćete kao developer retko ulaziti.

 

apex_administracija

APEX Administratorski servis

 

Trenutno ste ovde samo da biste definisali svoj korisnički nalog kao i lični radni prostor koji se zove WORKSPACE, odnosno ‘komad’ XE baze koji vam pripada, a tek onda možete da uđete u APEX radno okruženje koje se nalazi na http://127.0.0.1:8080/apex odnosno http://hostname.domain:8080/apex ali o tome nekom drugom prilikom. Do tada pretražujte ORACLE APEX blogove i forume pa pokušajte sami da nastavite priču.

Pozdrav iz NS.