Funcții definite de utilizator, Interbase, articole, programare - programare C, Delphi, C #

Funcții definite de utilizator

De multe ori de către programatori care folosesc alte servere de baze de date, puteți asculta opinia că SQL Interbase nu diferă o mare varietate de funcții încorporate. Punct de vedere tehnic, un astfel de punct de vedere are o bază, dar dezvoltatorii Interbase în mod deliberat a mers la această restricție. După cum sa afirmat în repetate rânduri, Interbase diferă cerințe de sistem modeste și ocupă puțin spațiu pe hard disk. Dimensiunea mică totală a fișierului este dictată, în special, faptul că Interbase nu este supraîncărcat cu diferite opțional și, în general, rareori funcțiile utilizate în schimb, Interbase include capacitatea de a extinde setul de caracteristici standard, cu privire la orice adăugiri care sunt necesare într-o anumită bază de date. Astfel, un dezvoltator poate implementa pentru aplicațiile lor chiar și astfel de funcții ca nu sunt incluse în livrarea de servere de baze de date.

Mecanismul de caracteristici de conectivitate

In special pentru extinderea funcționalitatea SQL Interbase oferă un mecanism pentru funcțiile definite de utilizator (utilizator funcții definite). Puteți crea o bibliotecă de legături dinamice (Dynamic Link Library) folosind orice sistem de dezvoltare care vă permite să creați fișiere executabile în acest format. În special, este posibil să se utilizeze Borland Delphi, Borland C ++ Builder, Microsoft Visual C ++, și așa mai departe. D. Apoi, aveți nevoie pentru a pune DLL rezultat la directorul din care Interbase va duce la bibliotecă, și să declare funcția dorită din DLL în baza de date folosind comanda DECLARE FUNCȚIA externe. Apoi, puteți invoca aceste funcții ca și în cazul în care acestea au fost încorporate în funcții de Interbase.

Interbase la versiunea 6.0 necesar ca DLL-ul este în oricare dintre directoarele listate în mediu PATH variabila Interbase 6 și în sus (inclusiv clone Firebird și Yaffil) impune ca DLL-ul a fost plasat într-un director UDF specială în instalarea Interbase director partajat

Crearea de funcții personalizate

Nu vom insista asupra toate caracteristicile pentru a crea funcții personalizate, deoarece acest mecanism este destul de simplu, cu toate acestea, să demonstreze scris și conectarea o funcție în exemplul. Ca instrument de dezvoltare, vom folosi Borland Delphi. De exemplu, standardul se va aplica, de asemenea, baza de date cu EMPLOYEE.GDB.
În exemplul nostru, vom crea o funcție care va converti un șir de caractere în majuscule. O astfel de caracteristică poate fi utilă în cazul în care nu specificați opțiunea COLLATE pentru câmpurile de coarde. În plus, lucrul cu parametri un șir ca regulă, provoacă cel mai mare număr de întrebări atunci când crearea de funcții definite de utilizator. Desigur, presupunem că sunteți familiarizați cu principiul de a crea un DLL folosind Delphi.

bibliotecă dinamică exportă o singură funcție: StrUpperCase. Pentru a transfera parametrii string, precum și rezultatul funcției este utilizat tip Pchar, adică. Linia dinamică mărginită de simboluri # 0. Semnificația codului nostru funcție este clar: vom da șir sz în cazul în sus, folosind AnsiUpperCase functie standard. Această funcție funcționează corect cu litere românești în cazul în care sistemul este instalat pagina de cod rusesc. După aceea ne-am aloca memorie pentru variabila rezultat, folosind malloc - o caracteristică standard pentru Windows. Rămâne doar să copiați valoarea unei variabile Rezultat variabilă temporară tmp. Compilați biblioteca și plasați fișierul TestUDF.dll rezultat în directorul dorit. Dacă utilizați InterBase 6.x sau clonele sale, acesta este un director \ UDF, care se află în directorul de instalare a serverului. Este necesar să se înregistreze funcția în baza de date. Pentru a vă înregistra, trebuie să executați FUNCȚIA EXTERN DECLARE, care are următoarea sintaxă:

DECLAR Numele funcției EXTERNE [datatype | CString (int)
[, Tip de date | CString (int). ]]
RETURNĂRI (datatype [BY VALUE] | CString (int)> [FREE_IT]
ENTRY_POINT 'entryname'
MODULE_NAME 'modulename';

Numele parametrului - este numele unei funcții definite de utilizator în baza de date. El nu trebuie să coincidă cu numele real al funcției în DLL.
parametru specifică tipul datatype de parametri. Pe parametrii următoarele restricții:

  • toți parametrii sunt transmise prin referință;
  • parametru de ieșire (valoarea funcției) poate fi returnat de valoare;
  • parametrii nu pot fi tablouri.

Dacă doriți să utilizați valori string, ar trebui să utilizați tipul CString între paranteze trebuie să specifice lungimea maximă a șirului. Dacă șirul este un rezultat al funcției, este întotdeauna trecut prin referință, nu de valoare.
Puncte FREE_IT parametru Interbase, că, după funcția pe care doriți să îl eliberați în mod automat memoria alocată pentru parametrii. Evident, această opțiune este necesară numai în cazul în care biblioteca în sine noastre mm de memorie partajată pentru parametrii funcției.
În parametrul entryname trebuie să specificați numele funcției în DLL, pentru a toruyu de fapt, vrem să declarăm ca o funcție definită de utilizator.
Parametrul modulename trebuie să specificați numele de fișier DLL, care este declarat de funcția de utilizator.
Trebuie remarcat faptul că parametrii entryname și sensibil-modulename.
Astfel, pentru a adăuga funcția noastră în baza de date, trebuie să executați următoarea comandă:

DECLAR USTRUPPERCASE FUNCȚIA EXTERNĂ
CString (254)
RETURNĂRI cstnng (254) FREE_IT
ENTRY_POINT 'StrUpperCase' MODULE_NAME 'TestUDF.dll'

După aceea, putem folosi o caracteristică nouă în orice USTRUPPERCASE SQL-interogare. De exemplu, putem verifica modul în care funcționează funcția pe următoarea interogare:

SELECT USTRUPPERCASE (DEPARTAMENTUL) DIN DEPARTAMENTUL

Solicitare returnează numele departamentelor din tabel DEPARTAMENTUL:

Figura 1.5. Rezultatul folosirii UDF USTRUPPERCASE

Am văzut un exemplu de modul în care se poate extinde gama de SQL-funcții disponibile folosind Definit de utilizator mecanism Funcții. Cu acest instrument simplu, dar foarte puternic, puteți face procesarea regulilor de business în bazele de date mult mai eficient și convenabil. De fapt, mecanismul de funcții personalizate Interbase este doar o limitare serioasă - nu se poate ocupa NULL-parametri. Restul funcționalității „Extensii“ personalizate SQL depinde de nevoile dumneavoastra.
O selecție largă de UDF biblioteci, precum și informații mai detaliate cu privire la utilizarea și dezvoltarea lor poate fi întotdeauna găsite pe site-urile și www.InterBaseworld.com www.ibase.ru.

Borland InterBase 6.x și clonele sale Firebird și Yaffil - produselor destinate consumatorului internațional și care să permită să lucreze cu mai multe limbi, inclusiv română. Cu toate acestea, implicit, Interbase este proiectat pentru a lucra cu limba engleză, astfel încât, în scopul de a stoca într-o bază de date alfabetul chirilic și să fie capabil să-l recupereze într-o formă ușor de citit, trebuie să facă o serie de acțiuni pe „rusificare“ a bazei de date și includerea suportului pentru alfabetul chirilic în aplicațiile client.