Records and Collections – Part I
Thursday, 27.08.2009 – Noctua4uČesto u programerskim razgovorima dođe do nesporazuma oko nekih stvari koje postoje svuda (i u razvojnim jezicima i u bazama), koje se ponašaju na istovetan ili približno istovetan način, ali se nazivaju drugačije.
Jedan od najčešćih kamena spoticanja u razgovorima, a ne retko i u realizaciji, je struktura podataka poznata kao… Hm, u programskim jezicima se sreće kao RecordSet, Sets, Bags, Lookup tables, Arrays, Records…
Za početak, definisaćemo šta je šta, čemu služi, kako izgleda, i upoznaćemo se sa osnovnim pojmovima.
Stalna praksa je prenos podataka na relaciji DB – KLIJENT. Dvosmerno. (Pod KLIJENT podrazumevam bilo koji programski jezik, aplikaciju, skript… bilo šta što pristupa i koristi bazu).
U većem broju slučajeva, mnogo toga se može završiti jednostavnim pozivom procedura/funcija. Vi ih pozovete, one vam vrate rezultat (ili nešto odrade pa vrate rezultat).
Lepo i jednostavno.
Ali šta raditi kada je KLIJENTU potrebno mnogo rezultata? Logično rešenje je proslediti sve tražene podatke.
Kako? Pomoću recordseta.
Da bi koristili recordset, potrebno je “napraviti” novi tip podataka koji predstavlja strukturu informacija koje prenosite tj, sa kojima radite.
Kod Oracle-a, u te svrhe postoje PL/SQL collections i Records:
- Kolekcija (Collection – Zbirka, kolekcija) je uređena grupa podataka ISTOG tipa.
- Record (Record – Zapis, slog) je grupa podataka, pri čemu svaki podatak ima svoje IME i svoj TIP.
Pri čemu Kolekcije mogu da budu:
- Associative arrays (asocijativni nizovi) – Sadrže proizvoljan broj elemenata kojima se pristupa brojem ili imenom. Možemo reći da je to skup Ključ-Vrednost parova pri čemu je svaki Ključ jedinstven i koristi se da bi se dobila Vrednost (npr: mojNiz(“prvi_element”) := 1 ili mojNiz(1) := 1).
Kod Oracle-a ova struktura podataka je poznatijia kao “index-by tables” dok su u drugim programskim jezicima poznatiji (a i po funkcionalnosti približniji) kao “hash tables“. - Nested tables (ugnježdene tabele) – Sadrže proizvoljan broj elemenata sekvencionalno numerisanih. Element može da bude bilo koji tip (Number, Varchar, Record, PL/SQL Type…).
- Varrays (variable-size arrays) – Sadrže fiksan broj elemenata sekvencionalno numerisanih.
Record je tip podataka koji se sastoji od grupe polja. Slično kolonama u redu tabele. Kao što je ranije pomenuto, svako polje ima sve ime i svoj tip. Moguće je koristiti %ROWTYPE za deklaraciju PL/SQL record-a koji predstavlja red fizičke tabele u bazi a moguće je i pobrojati potrebne kolone.
Iako su kolekcije/record jednodimenzionalni tipovi podataka, moguće je kreirati višedimenzionalnu strukturu praveći kolekciju čiji su elemenati takođe kolekcije.
Moguće je kreirati i koristiti ih kako na globalnom nivou (na nivou DB, pri čemu se prava korišćenja novo kreiranog tipa/kolekcije dodeljuju na identičan način korisnicima/rolama kao i prava korišćenja tabela ili bilo kog drugog baznog objekta) tako i na lokalnom nivou (u okviru paketa, procedure, funkcije… pri čemu se kreiraju, inicijalizuju i koriste dok se izvršava procedura/funkcija).
Takođe, moguće je prosleđivati ih kako u/iz procedura i funkcija tako i van DB, ka klijentu.
Teorijska, globalna analogija sa postojećim programskim jezicima bi bila:
- Arrays (u drugim jezicima) < = > Varrays u PL/SQL
- Set, RecordSet, Record < = > Nested Tables
- Hash tables, Lookup tables < = > Associative Arrays
- RecordSet < = > Record
Zašto “teorijska” i zašto se pojedine stvari ponavljaju?
Jednostavno, moguće je, u zavisnosti od potreba, prikazivati strukture na različite načine.
Neke osobine i svojstva kolekcija:
- Nested tables
– Mogu biti tip podataka kolone u baznoj (fizičkoj) tabeli
– Vrednosti indexa (Misli se na Ključ) ne moraju da budu uzastopne
– Inicijalno nepoznat broj elemenata i njihova vrednost
– Promena samo nad pojedinim elementima (Update, Delete)
– Nakon smeštanja u bazu, redosled elemenata ne mora da bude sačuvan (tj. indeksi/ključevi kojima su indeksirani elementi ne moraju da budu sekvencionalni, naročito posle izvesnih operacija) - Varrays
– Mogu biti tip podataka kolone u baznoj (fizičkoj) tabeli
– Elementi su, obično, svi sekvencionalno ustrojeni.
– Unapred poznat broj elemenata i njihove vrednost
– Promena nad svim elementima istovremeno (naročito pogodno za masovan UPDATE)
– Nakon smeštanja u bazu, sačuvan je redosled. - Associative Arrays
– NE mogu biti tip podataka kolone u baznoj (fizičkoj) tabeli
– Inicijalno nepoznat broj elemenata i njihova vrednost.
– Redosled elemenata nije bitan jer im se pristupa po Ključu.
– Pogodni za relativno mali broj podataka koji se prikupljaju i inicijalizuju u memoriji svaki put kada se pozove procedura/funkcija
Kao zaključak prvog dela, bilo bi poželjno uočiti i upamtiti suštinsku razliku: Kolekcije su grupa podataka ISTOG tipa, a Record je grupa podataka RAZLIČITOG tipa.
Takođe, razlike u kolekcijama su u broju elemenata (poznat, nepoznat), redosledu elemenata (promenljiv i ne narušava se) i načinu pristupa elementima (po imenu ili po poziciji).
U “sledećem broju” malo tehničkih karakteristika, kreiranje, inicijalizacija i korišćenje.
3 Responses to “Records and Collections – Part I”
@Noctua4u
Jel znas SQL Server, ili znaš da radiš samo ORACLE?
Ovo je odlično napisano!
Pozdrav!
By borski on Aug 28, 2009
Hvala 🙂
Pa, znam teorijski kako bi to trebalo na SQL serveru da radi… mada praktičnog iskustva imam samo sa Oracle-om…
E, sad, ako si ozbiljno zainteresovan, znam koga da pitam.:)
By Noctua4u on Aug 31, 2009
@Noctua4u: Svaka čast na odličnom tekstu! Imaš stvarno jedinstven stil pisanja…
By Dejan on Sep 1, 2009