Book - lacom chelen - ghidul de dezvoltatori de baze de date firebird - citiți online, pagina 41

Arrays pot conține elemente ale oricărui tip de Firebird acceptat, cu excepția BLOB-urilor. Matricele array nu sunt acceptate. Toate elementele dintr-o anumită matrice au același tip de date.

O matrice poate fi definită ca un domeniu (utilizând CREATE DOMAIN) sau ca o coloană într-o instrucțiune CREATE TABLE sau ALTER TABLE. Definiția unui domeniu sau a unei coloane ca matrice este similară cu definiția oricărui alt astfel de obiect, doar dimensiunea matricei este adăugată aici. Dimensiunea matricei este cuprinsă în paranteze pătrate și urmează specificația tipului de date.

De exemplu, următoarea declarație definește o coloană de caractere obișnuită și o coloană sub forma unei matrice caracter unidimensionale care conține opt elemente:

CREATE TABLE ATABLE (ID BIGINT,

ARR_CHAR (14) [8] OCTETE SETATE CHARACTER);

/ * stochează 1 rând de 8 elemente * /

Firebird suporta matrice multidimensionale de la 1 la 16. De exemplu, următoarea afirmație definește trei coloane ale rețelelor întregi cu două, trei și patru dimensiuni:

CREATE TABLE BTABLE (

/ * stochează 4 rânduri de 5 elemente = 20 elemente * /

/ * 6 niveluri, 4 rânduri de 5 elemente fiecare = 120 elemente * /

ARR_INT3 INTEGER [4,5,6],

/ * 7 niveluri, 6 niveluri în 4 rânduri de 5 elemente = 840 elemente * /

Firebird stochează matrice multidimensionale în ordinea rândurilor. În unele limbi, cum ar fi FORTRAN, este de așteptat ca matricele să fie stocate în ordinea desfășurării prin coloane. În astfel de cazuri, aveți grijă de traducerea corectă a ordinii elementelor între Firebird și limba de programare folosită.

Specificarea unui interval de valori index pentru dimensiuni

Dimensiunile matricelor din Firebird sunt setate ca limite superioare și inferioare, numite listă index. Implicit, dimensiunile se bazează pe 1 - primul element dintr-o matrice de elemente n are indexul 1, al doilea element are indexul 2, iar ultimul element este indexul n. De exemplu, următoarea instrucțiune creează un tabel cu o coloană care este o matrice de patru numere întregi:

CREATE TABLECUL DE TABEL (ARR_INT INTEGER [4]);

Indicii acestei matrice sunt 1, 2, 3 și 4.

Limitele personalizate (explicite) ale indicilor

Setarea personalizată a limitelor superioare și inferioare poate fi definită explicit pentru fiecare dimensiune a matricei atunci când este creată coloana ARRAY. De exemplu, programatorii C și Pascal, familiarizat cu matrice bazate pe zero, coloanele pot crea matrici cu o limită inferioară de zero pentru respectarea deplină cu structura de matrice în codul de aplicare.

Limitele inferioare și superioare ale dimensiunii sunt necesare la definirea limitelor utilizatorilor. Se folosește următoarea sintaxă:

Următorul exemplu creează un tabel cu o matrice unidimensională, bazată pe matrice:

Creați tabelul TABLED

/ * indicii 0, 1, 2 și 3. * /

Fiecare specificare a limitelor dimensiunii este separată de următoarea virgulă. De exemplu, următoarea instrucțiune creează un tabel cu o coloană dintr-o matrice de dimensiune două, unde ambele dimensiuni se bazează pe zero:

CREATE TABLE TABLEE

(ARR_INT INTEGER [0: 3, 0: 3]);

Stocarea coloanelor array

Ca și alte tipuri de date implementate ca BLOB-uri, Firebird stochează identificatorul matricei în coloana tabelului bazei de date care referă la o pagină care conține datele reale.

Ca și în cazul altor tipuri BLOB, serverul Firebird nu poate vizualiza secvențial articole individuale atunci când se face o actualizare condiționată. Într-o singură instrucțiune DML, este posibil să se izoleze un element sau un set de elemente consecutive, numit fragment, și să se transmită acest fragment pentru actualizare.

Instrucțiunea INSERT nu poate gestiona fragmente. Atunci când un rând este adăugat la o tabelă care conține coloane de matrice, trebuie să proiectați și să umpleți întreaga matrice înainte de ao trece la INSERT.

Accesarea datelor matrice

Unele interfețe de aplicație încorporează funcțiile API și descriptorii, accesul limitat la citire este posibil din procedurile stocate.

/ * limita inferioară a unei matrice sau a unui fragment * /

/ * limita superioară a matricei sau fragmentului * /

nesemnate char array_desc_dtype;

/ * tipul datelor de elemente * /

/ * scară pentru tipurile numerice * /

nesemnate scurtă array_desc_length;

/ * lungimea elementului matricei în octeți * /

CAPITOLUL 13. Domenii.

Domeniile din Firebird sunt similare cu conceptul de "tipuri de date definite de utilizator". Deși este imposibil să creați un nou tip de date într-un domeniu, puteți să "pachetezi" un set de atribute cu unul dintre tipurile de date existente, să îi atribuiți un identificator și apoi să îl utilizați ca parametru de tip de date pentru a determina coloanele din orice tabel.

definiții de domeniu sunt la baza de date la nivel mondial - toate coloanele din orice tabel, care au fost identificate cu un singur domeniu va avea un atribute complet identice, cu excepția celor care au fost înlocuite la nivel local.

Așa cum am notat, domeniile nu pot înlocui tipurile de date atunci când se definesc argumentele și variabilele în procedurile și declanșatoarele stocate.

NOTĂ. Înlocuirea atributelor de domeniu la nivel de coloană este discutată mai târziu în acest capitol.

Coloanele bazate pe definițiile domeniilor moștenesc toate atributele de domeniu care pot fi:

* tipul de date (necesar);

* valoarea implicită pentru INSERT;

* un set de caractere (numai pentru caractere și coloane BLOB);

* sortare ordine (numai pentru coloane de caractere).

NOTĂ. Nu puteți utiliza constrângerile de integritate referențială în domeniu.

Avantajele încapsulării definiției datelor sunt evidente. Pentru un exemplu simplu, dar generală, să presupunem că proiectarea unui tratament pentru o varietate de mese mici, în cazul în care aveți de gând pentru a stoca descrieri text ale seturilor numerotate - tabel „tipuri“ - tipurile de conturi, tipuri de produse, tipuri de donații, etc. Dvs. decideți că fiecare element al fiecăruia dintre aceste seturi va avea o cheie constând din trei caractere majuscule care indică o descriere a caracterelor sau un antet care are maximum 25 de caractere.

Toate acestea necesită crearea a două domenii.

* Domeniul pentru indicatorul este CHAR (3) cu două atribute suplimentare: limita NOT NULL, pentru că aveți de gând să-l utilizați drept cheie primară și tasta de căutare, și o constrângere de verificare pentru a verifica cu majuscule. De exemplu:

CREAȚI DOMENIUL Tour_Kee AS CHAR (3) NU NULL

* Domeniul descrierii va fi VARCHAR (25). Doriți să respingeți valori nula pentru el, deoarece tabelele în care o veți utiliza sunt controlori:

CREATE DOMAIN Tip_Descriere AS VARCHAR (25) NU NULL;

Când creați aceste domenii, toate tabelele asociate pot avea definiții similare, iar toate tabelele care stochează cheile care fac referire la astfel de tabele vor utiliza domeniul corespunzător pentru coloanele cheie.

Sintaxa pentru limba de definire a datelor (DDL) pentru crearea unui domeniu este:

Domeniul CREATE DOMAIN [AS] <тип-данных>

[DEFAULT literal | NULL | USER]

[NU NULL] [CHECK (<условие-поиска-домена>)]

Articole similare