CATEGORII DOCUMENTE |
Utilizarea tipurilor de date ofera urmatoarele avantaje:
Permit conservarea spatiului de stocare prin adaptarea tipului la datele stocate.
Permit conversia automata a datelor in anumite conditii.
Tipuri de date scalare:
Tipul char
Tipul char este utilizat pentru a defini o coloana care contine siruri de caractere de lungime fixa. Lungimea acestor caractere este determinata de numarul de octeti cerut pentru stocarea unui caracter (determinat de setul de caractere cu care a fost creata baza), avind o limita superioara de 2000 de octeti pentru o linie. Acest tip de date stocheaza date alfanumerice. La utilizarea acestui tip de date server-ul Oracle efectueaza urmatoarele operatii:
La definirea coloanei I se atribuie lungimea fixa specificata, iar la inserarea unei valori aceasta este ajustata pentru a o aduce la lungimea respectiva.
Daca valoarea introdusa este mai scurta decat lungimea de definitie a coloanei, valorii ii sunt adaugate spatii.
Daca valoarea introdusa este mai lunga decat lungimea de definitie a coloanei, Oracle returneaza un cod de eroare.
Daca valoarea care depaseste lungimea coloanei poseda spatii la sfarsit, acestea sunt eliminate pentru a aduce data la lungimea fixata.
Tipul varchar2
Tipul varchar2 este utilizat pentru a defini o coloana care contine siruri de caractere de lungime variabila. Lungimea acestor caractere poate variabila, pana la 4000 de octeti pentru o linie. Pentru o coloana definita ca fiind de acest tip fiecare data este stocata ca data de lungime variabila.
La utilizarea acestui tip de date server-ul Oracle efectueaza urmatoarele operatii:
La definirea coloanei ii atribuie lungimea maxima specificata, iar la inserarea unei valori aceasta este de lungime variabila.
Daca valoarea introdusa este mai scurta decat lungimea de definitie a coloanei, nu sunt adaugate spatii la sfarsitul valorii. Acesta este un tip de date in care valorile nu sunt completate cu spatii.
Daca valoarea introdusa este mai lunga decat lungimea de definitie a coloanei, server-ul Oracle returneaza un cod de eroare.
Daca valoarea care depaseste lungimea coloanei poseda spatii la sfarsit, acestea sunt eliminate pentru a aduce data la lungimea fixata.
Tipul number
Acest tip de date stocheaza numere in virgula fixa si in virgula mobila, permitand definirea preciziei si a scalei. Practic pot fi stocate numere oricat de mari. Precizia este egala cu numarul total de cifre ale numarului, scala referind numarul de cifre din dreapta punctului zecimal. Numerele pot fi stocate cu o precizie de pana la 38 de cifre.
Tipul date
Acest tip de date stocheaza data calendaristica si ora in coloanele unui tabel cu precizie de o secunda, stocand cele patru cifre ale anului, luna, ziua, ora, minutele si secundele scurse de la miezul noptii.
Pentru operatiile de intrare/iesire de date, formatul pestabilit este DD-MON-YYYY. Ora este stocata sub forma HH:MM:SS. Nu se poate specifica da in litere. Daca nu se specifica componenta pentru ora intr-o valoare de tip data, ora prestabilita este 12:00:00 AM. In mod similar, se omite componenta corespunzatoare datei calendaristice a unei valori de tip data, data prestabilita este prima zi a lunii curente. Domeniul valid pentr date calendaristice este 1 ian 4712 i.e.n - 1 ian 4712 e.n.
Tipul long
Coloanele, variabilele si constantele de tip long stocheaza date caracter cu lungime variabila continand pana la 2 GB de informatie. Acest tip de date prezinta urmatoarele limitari:
Intr-un tabel este permisa o singura coloana de tip long.
Coloanele de tip long nu pot fi indexate.
Coloanele de acest tip nu pot aparea in restrictii de integritate.
Nu se pot face referiri la coloane de acest tip in functii SQL cum sunt substr, length si asa mai departe.
Coloanele de tip long nu pot fi utilizate in clauzele where, group by, order by si connect by
In unitati de program PL/SQL nu pot aparea variabile sau argumente de tip long
Tipurile de date raw si long raw
Aceste tipuri de date sunt destinate datelor binare. Ele nu trebuie utilizate atunci cind datele urmeaza sa fie interpretate de Oracle. Aceste tipuri de date sunt recomandate pentru stocarea datelor multimedia sau a altor fisiere binare.
Tipul raw este similar cu tipul varchar2, iar long raw este similar cu tipul long. Singura deosebire este ca datele nu fac obiectul operatiunilor de conversie la atribuire atunci cand datele de acest tip sunt transmise intre diferite masini in retea sau sunt mutate dintr-o baza de date intr-alta utilizand programe utilitare Oracle. Datele de tip raw nu pot fi indexate, in timp ce datele de tip long raw pot fi indexate.
Tipul LOB este similar tipului de date long, fiind superior acestuia datorita urmatoarelor caracteristici:
Permite definirea mai multor coloane de acest tip intr-un tabel
Dimensiunea maxima este de 4GB
Datele pot fi stocate atat in interiorul structurii de stocare cat si in exteriorul acesteia
Accesul la datele stocate intr-un astfel de camp este aleator, fiind facut pe baza unui index creat automat la crearea structurii de date ce contine un atribut de acest tip.
Tipul de date LOB pastreaza un pointer in tabel, iar datele pot fi stocate intr-un segment sau spatiu-tabel separat sau intr-un fisier, mai putin cele ale caror dimensiune nu este mai mare decat a tipul de date VARCHAR2.
Tipuri de date de tip inregistrare:
VARRAY
Tabele incapsulate
Tipul VARRAY este folositor pentru a stoca liste ce continun numar mic de elemente, cum ar fi numele de telefon pentru un anumit abonat. Acest tip de date are urmatoarele caracteristici:
Un varray este un set de date ordonate.
Toate elementele din matrice sunt de acelasi tip.
Fiecare element are un index, care este numarul corespunzator pozitiei elementului din matrice.
Numarul de element din matrice determina dimensiunea acesteia.
Server-ul Oracle permite matricii sa fie de dimensiune variabila, dar dimensiunea maxima trebuie specificata la declararea tipului matricii.
Tabelele incapsulate furnizeaza mijlocul de a definii un tabel ca o coloana in interiorul altui tabel. Poate fi folosit pentru a stoca seturi de date ce detin un mare numar de inregistrari.
Tabelele incapsulate au urmatoarele caracteristici:
Un tabel incapsulat este un set de inregistrari sau linii neordonate.
Liniile dintr-un astfel de tabel au aceeasi structura.
Liniile dintr-un tabel incapsulat sunt stocate separat fata de tabelul parinte, lasand un pointer pentru linia corespunzatoare in tabelul parinte.
Caracteristicile de stocare pot fi definite de catre administrator.
Nu exista limita maxima de spatiu pentru acest tip de tabele.
Exista doua formate ale tipului ROWID:
Extins
Restrans
Formatul ROWID extins necesita 10 octeti de spatiu pe disc si este afisat utilizand 18 caractere. El consta din urmatoarele componente:
Numarul data-obiectului: este asignat fiecarui data-obiect, cum ar fi un tabel sau un index atunci cand este creat, fiind unic in baza de date.
Numarul relativ al fisierelui: este unic fiecarui fisier al unui spatiu-tabel.
Numarul blocului: reprezinta pozitia blocului ce contine linia de date in interiorul unui fisier.
Numarul liniei: identifica pozitia slotului liniei in header-ul blocului.
Reprezentarea interna Oracle este urmatoarea:
Data-obiectul necesita 32 biti.
Numarul relativ al fisierului: 10 biti.
Numarul blocului: 22 biti.
Numarul liniei: 16 biti.
Pentru afisarea celor 18 caractere Oracle foloseste o schema de codificare de 64 caractere (A - Z, a - z, 0 - 9, /) astfel:
Primele sase pozitii pentru numarul data-obiectului.
Urmatoarele trei pozitii pentru numarul fisierului.
Urmatoarele sase pozitii pentru numarul blocului.
Urmatoarele trei pozitii pentru numarul liniei.
Exemplu:
SQL> select empno, rowid from emp;
EMPNO ROWID
7369 AAACC2 AAB AAAKqS AAA
7499 AAACC2AABAAAKqSAAB
7521 AAACC2AABAAAKqSAAC
7566 AAACC2AABAAAKqSAAD
7654 AAACC2AABAAAKqSAAE
7698 AAACC2AABAAAKqSAAF
7782 AAACC2AABAAAKqSAAG
7788 AAACC2AABAAAKqSAAH
7839 AAACC2AABAAAKqSAAI
7844 AAACC2AABAAAKqSAAJ
7876 AAACC2AABAAAKqSAAK
7900 AAACC2AABAAAKqSAAL
7902 AAACC2AABAAAKqSAAM
7934 AAACC2AABAAAKqSAAN
Formatul ROWID restrans este folosit la versiunile anterioare Oracle8. Acest format foloseste numai sase octeti pentru codificarea interna si nu contine numarul data-obiectului. Acest format a fost acceptabil pentru Oracle7 si versiunile anterioare deoarece numarul fisierului era unic in baza de date, aceste versiuni neacceptand mai mult de 1022 fisiere de date. Chiar daca Oracle8 nu mai are aceasta restrictie, folosind numere unice relativ la spatiu-tabel, formatul restrans este folosit in continuare la obiecte ca tabele si indecsi partitionati unde toate intrarile se refera la linii din interiorul aceluiasi segment.
Localizarea unei linii folosind ROWID
Deoarece un segment poate apartine unui singur spatiu-tabel, prin utilizarea numarului fisierului relativ la spatiu-tabel, oracle poate determina spatiu-tabel unde este localizata linia respectiva. Numarul fisierului relativ la spatiul-tabel este folosit pentru a localiza fisierul, numarul blocului este folosit pentru a localiza bocul continand linia respectiva, iar numarul liniei este folosit pentru a localiza intrarea liniei cautate. Intrarea liniei este folosita pentru a determina inceputul liniei respective.
Liniile de date sunt stocate ca inregistrari de lungime variabila. Coloanele pentru o linie sunt in general stocate in ordinea in care au fost definite. Fiecare linie din tabel este alcatuita din:
Header: este utilizat pentru a stoca numarul de coloane din linie, informatiile despre inlantuire si informatiile despre mecanisml de blocare.
Date: pentru fiecare coloana, server-ul Oracle stocheaza lungimea coloanei si valoarea (un octet este necesar pentru a stoca lungimea coloanei, iar daca aceasta are mai mult de 250 octeti de date sunt necesari 3 octeti). Valoarea coloanei este stocata imediat dupa valoarea lungimii coloanei.
Liniile adiacente nu necesita nici un fel de spatiu intre ele. Fiecare linie din bloc are un slot (intrare) in directorul liniilor. Acest slot pointeaza catre inceputul liniei respective.
Comanda CREATE TABLE este utilizata pentru a crea tabele relationale sau tabele obiect.
La crearea unui tabel relational este de dorit a se tine seama de urmatoarele aspecte:
Plasarea tabelelor in spatii-tabel diferite pentru o mai buna repartitie a operatiilor de I/O.
Utilizarea spatiilor-tabel administrate local pentru a evita fragmentarea.
Pentru a putea crea tabele in propria schema utilizatorul trebuie sa aiba privilegiul sistem CREATE TABLE. Pentru a putea crea tabele in schemele altor utilizatori este necesar privilegiul CREATE ANY TABLE.
Exemplu:
SQL>CREATE TABLE departments_demo
( department_id NUMBER(4) ,
department_name VARCHAR2(30),
manager_id NUMBER(6) ,
location_id NUMBER(4) ,
dn VARCHAR2(300) ) ;
STORAGE (INITIAL 200K NEXT 200K PCTINCREASE 0 MINEXTENTS 1
MAXEXTENTS 5)
PCTFREE 10
PCTUSED 80
TABLESPACE TBS_DATE;
Crearea tabelelor temporare este necesara pentru stocarea datelor unei sesiuni private, date ce exista numai pe durata tranzactiei sau sesiunii respective.
Comanda CREATE GLOBAL TEMPORARY TABLE creaza un tabel temporar ce poate fi specific unei tranzactii sau unei sesiuni. Pentru tabelele temporare specifice unei tranzactii, datele exista pe durata intregii tranzactii, in timp ce pentru un tabel specific unei sesiuni datele exista pe durata intregii sesiuni. Datele din sesiune sunt private sesiunii respective, fiecare sesiune putand vedea sau modifica numai propriile sale date. Blocarile DML nu sunt necesare pentru datele din tabelele temporare. Clausele ce controleaza durata existentei datelor in tabelele temporare sunt:
ON COMMIT DELETE ROWS: specifica faptul ca liniile sunt vizibile in timpul tranzactiei.
ON COMMIT PRESERVE ROWS: specifica faptul ca liniile sunt vizibile in timpul sesiunii.
Se por crea indecsi, vederi, trigger-I pe tabelele temporare si deasemenea se poate folosi utilitarele specifice Oracle pentru a exporta sau a importa definitiile tabelelor temporare. Oricum, nu pot fi exportate datele din aceste tabele, chiar daca se utilizeaza optiunea ROWS.
Daca parametru PCTFREE este setat la o valoare scazuta, exista posibilitatea ca intr-un bloc sa nu mai existe spatiu suficient pentru extinderea unei linii ca rezultat al unei actualizari. In acest moment server-ul Oracle muta intreaga linie intr-un bloc nou lasand in locul acesteia un pointer din blocul original catre noua locatie. Acest proces este cunoscut sub denumirea de migrarea liniilor. Cand liniile migreaza, performanta operatiilor de I/O scade deoarece server-ul Oracle trebuie sa scaneze in doua blocuri de date pentru regasirea datelor dintr-o linie migrata.
Inlantuirea liniilor are loc in momentul in care o linie este prea mare pentru a se potrivi intr-un singur bloc de date. Aceasta se poate intampla cand o linie contine o coloana foarte lunga. In acest caz, server-ul Oracle imparte linia in fragmente mai mici numite bucati de linie. Fiecare bucata de linie este stocata este stocata in cate un bloc de date impreuna cu un pointer necesar pentru regasirea si asamblarea intregii linii. Inlantuirea liniilor poate fi evitata prin alegerea dimensiunii corespunzatoare a blocului de date ori prin inpartirea unui tabel in mai multe tabele, fiecare dintre acestea continand mai putine coloane.
O parte din parametrii de stocare si cei de utilizare a blocului pot fi modificati utilizand comanda ALTER TABLE:
ALTER TABLE [schema.]tabel
Parametrii pot fi modificati, implicatiile fiind utmatoarele:
NEXT: cand server-ul Oracle aloca un nou extent pentru un tabel, va fi folosita noua valoare. Dimensiunea extentului urmator va creste cu valoarea parametrului PCTINCREASE raportata la noua valoare.
PCTINCREASE: o schimbare a acestuia va fi inregistrata in dictionarul de date. Va fi folosit pentru a recalcula parametrul NEXT de fiecare data cand un nou extent este alocat de catre server-ul Oracle.
MINEXTENTS: aceasta valoare poate fi schimbata cu orice valoare care este mai mica sau egala cu numarul curent de extenti din tabel. Aceasta operatie nu va avea efect imediat, dar va fi folositoare la trunchierea tabelului.
MAXEXTENTS: aceasta valoare poate fi schimbata cu orice valoare care este mai mare sau egala cu numarul curent de extenti din tabel. Valoarea poate fi setata si ca fiind UNLIMITED.
Restrictii:
Valoarea INITIAL nu poate fi modificata.
Valoarea NEXT specificata va fi rotunjita la o valoare multiplu de dimensiunea blocului sau cel putin egala.
Este folositoare pentru:
Controlul distributiei extentilor raportat la fisierele de date ale tabelului.
Inainte de incarcari masive de date pentru a evita extensia dinamica a tabelului.
Sintaxa:
ALTER TABLE [ schema.]table
ALLOCATE EXTENT [ ( [ SIZE integer [ K | M ] ]
[ DATAFILE 'filename' ] ) ]
Daca este omis parametrul SIZE, server-ul Oracle va folosi valoarea parametrului NEXT_EXTENT din vederea dinamica DBA_TABLES pentru a aloca extentul. Fisierul specificat in clauza DATAFILE trebuie sa apartina spatiului-tabel caruia ii apartine fisierul, altfel Oracle va genera o eroare. Daca clauza DATAFILE nu este folosita, server-ul Oracle va aloca extentul intr-unul din fisierele de date din spatiul-tabel ce contine tabelul.
Un tabel nepartitionat poate fi mutat fara a fi necesare utilitarele de export si import ale server-ului Oracle. In plus, parametrii de stocare pot fi schimbati. Acest lucru este folositor atunci cand:
Un tabel se muta dintr-un spatiu-tabel intr-altul.
Se reorganizeaza tabelul pentru a elimina migrarea liniilor.
Dupa mutarea unui table este necesara reconstruirea indecsilor, deoarece componentele de adresa fizica din rowid-ul fiecarei inregistrari se schimba.
Sintaxa:
TRUNCATE TABLE [schema.]tabel
[ STORAGE ]
Efectul executarii acestei comenzi este urmatorul:
Toate liniile din tabel sunt sterse.
Nu se genereaza informatie de revenire.
Indecsii corespunzatori sunt deasemenea trunchiati.
Tabelele ce sunt referite de catre o cheie externa nu pot fi trunchiate.
Triger-ii de DELETE nu declanseaza la executarea acestei comenzi.
Un tabel poate fi sters daca nu mai este util sau daca se reorganizeaza.
Sintaxa:
DROP TABLE [ schema. ] tabel
[ CASCADE CONSTRAINTS ]
Cand un tabel este sters, extentii folositi de catre acesta sunt eliberati. Daca acestia ocupa o zona de memorie contigua, ei pot fi compactati manual sau automat de catre procesul de fundal SMON. Optiunea cascade constraints este necesara daca tabelul este parinte intr-o relatie de cheie externa.
Stergerea unei coloane dintr-un tabel devine posibila la versiunea Oracle 8i, fara a mai fi necesar exportul sau importul datelor tabelului si recrearea indecsilor si a constrangerilor.
Utilizarea checkpoint-ului la stregerea unei coloane:
Stergerea unei coloane poate fi mare comsumatoare de timp si de resurse, fiind necesara o mare cantitate de spatiu in segmentul de revenire. Cand se sterg coloane din tabele mari, poate fi specificate checkpoint-uri pentru a minimiza cantitatea de spatiu de revenire. In exemplul urmator un checkpoint se realizeaza la fiecare 1000 de linii:
ALTER TABLE test
DROP COLUMN coloana
CASCADE CONST RAINTS CHECKPOINT 1000;
Tabelul este marcat ca fiind INVALID pana ce operatia este completa. Daca instanta esueaza in timpul acestei operatiuni, tabelul ramane INVALID la repornire, iar operatiuni va fi completata. Pentru a continua operatiunea se executa urmatoarea comanda:
ALTER TABLE test DROP COLUMNS CONTINUE;
Utilizarea acestei comenzi va genera o eroare daca tabelul este in stare valida.
Pentru a evita consumul suplimentar de resurse necesar la stergerea unei coloane, exista posibilitatea marcarii acesteia ca fiind de nefolosit (UNUSED) si stergerea acesteia ulterior, in momentul in care sistemul este mai putin solicitat. Marcarea unei coloane ca fiind de nefolosit are avantajul de fi foarte rapida si nu reclama spatiul pe disc deoarece datele nu sunt sterse. Aceste coloane apar ca nemaifacand parte din tabel. Regasirile nu vor mai vedea datele din aceste coloane, numele si tipul datelor din aceste coloane neputand fi vizualizate la comanda DESCRIBE. Un utilizator poate adauga o noua coloana cu acelasi nume ca o coloana nefolosita.
Restrictii la stergerea coloanelor:
Nu se poate sterge o coloana de tip obiect.
Nu se poate sterge o coloana dintr-un tabel inlantuit.
Nu se pot sterge toate coloanele dintr-un tabel.
Nu se poate sterge o coloana care este cheie primara intr-un tabel partitionat.
Nu se poate sterge o coloana dintr-un tabel al utilizatorului SYS.
Nu se poate sterge o coloana dintr-un IOT daca este cheie primara.
Informatii despre tabele pot fi obtinute interogand urmatoarele vederi sistem:
DBA_TABLES
DBA_OBJECTS
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2046
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved