Crearea și utilizarea unei funcții în Baza de date Azure pentru PostgreSQL
Am învățat deja că PostgreSQL acceptă limbi diferite. Funcțiile pot fi clasificate în patru tipuri diferite:
- Funcții scrise în SQL.
- Funcțiile limbajului procedural, scrise într-un limbaj procedural acceptat, cum ar fi PL.pgSQL.
- Funcții interne.
- Funcții de limbă C.
În plus, scopul funcției poate fi, de asemenea, clasificat ca volatile, imutabilsau stabil.
O volatilă (implicită) poate modifica baza de date și poate să nu returneze neapărat același rezultat cu aceiași parametri de intrare de fiecare dată. Deci, de fiecare dată când se numește această funcție, trebuie reevaluată.
O funcție de stabilă nu poate modifica baza de date și returnează același rezultat dacă au trecut aceleași argumente și rulează în aceeași instrucțiune. Dacă această funcție este apelată de mai multe ori, utilitarul de optimizare a interogărilor poate utiliza rezultatele de la ultima apelare.
O funcție de imutabilă nu poate modifica baza de date și returnează aceleași rezultate dacă au trecut aceleași argumente, indiferent de interogarea care o apelează.
Volatilitatea unei funcții face o diferență mare față de eficiența cu care instrumentul de optimizare a interogărilor o gestionează.
Crearea unei funcții
O funcție returnează o singură valoare și poate fi utilizată într-o instrucțiune SELECT.
Sintaxa pentru crearea unei funcții este:
CREATE [OR REPLACE] FUNCTION
myfunction ([inputparam] type {default})
RETURNS returntype AS
$$
SQL body
$$
LANGUAGE 'language_name';
CREATE FUNCTION
La fel ca în ceea ce privește procedurile stocate, simbolul $$ este utilizat pentru a începe și a încheia șirul.
Funcțiile preiau următorii parametri:
- nume - includeți opțional numele schemei.
- argmode - modul argumentului. Poate fi IN, OUT, INOUT sau VARIADIC. Valoarea implicită este IN. VARDIAC este un număr nedefinit de argumente de intrare de același tip, și este urmat de argumente OUT. Argumentele OUT și INOUT nu pot fi utilizate împreună cu notații RETURN TABLE.
- numergname - nume argument.
- argtype - tipul de date al argumentului. Poate fi un tip de coloană de bază, compus sau de domeniu sau poate face referire la un tip de coloană de tabel. Tipul de coloană este scris ca table_name.column_name%TYPE. Acest tip de date vă poate ajuta să faceți o funcție independentă de modificările definițiilor de tabel.
- t_expr - o valoare implicită (de același tip) dacă parametrul nu este specificat. Doar parametrii IN și INOUT au o valoare implicită. Parametrii de intrare care urmează unui parametru cu o valoare implicită trebuie, de asemenea, să aibă valori implicite.
- tastați din nou - tipul de date returnat, care poate fi o bază, compus sau un tip de domeniu sau poate face referire la un tip de coloană de tabel. Dacă funcția nu returnează o valoare, specificați tipul returnat ca nul. Atunci când există parametri OUT sau INOUT, clauza RETURN poate fi omisă. Dacă există, trebuie să fie de acord cu tipul de rezultat implicat de parametrii de ieșire: RECORD dacă există mai mulți parametri de ieșire sau același tip ca parametrul de ieșire unic. Modificatorul SETOF indică faptul că funcția returnează un set de elemente, nu un singur element. Tipul unei coloane este menționat prin scrierea table_name.
- column_name - numele unei coloane de ieșire din sintaxa RETURN TABLE. Acest parametru declară un parametru OUT denumit, cu excepția faptului că RETURNEAZĂ TABLE implică, de asemenea, FUNCȚIA SETOF.
- column_type - tipul de date al unei coloane de ieșire în sintaxa RETURN TABLE.
- lang_name - limba utilizată pentru a scrie procedura. Valoarea implicită este sql dacă sql_body este specificată. Poate fi sql, c, intern sau numele unui limbaj procedural definit de utilizator, de exemplu, plpgsql.
Utilizați cuvintele cheie IMMUTABLE, STABLE sau VOLATILE ca indiciu pentru optimizatorul de interogare despre funcție. VOLATILE este valoarea implicită.
Apelarea unei funcții
O funcție poate fi utilizată într-o interogare prin transferarea tuturor parametrilor relevanți. De exemplu:
SELECT myfunction(3), CatID, CatName
FROM myCats
Funcții predefinite
PostgreSQL include multe funcții predefinite pe care le puteți utiliza în interogările dvs. Acestea acoperă efectuarea de comparații, agregarea datelor, funcții matematice etc. Consultați documentația online pentru o listă completă a funcțiilor PostgreSQL.
Un exemplu de funcție șir încorporată este subșir .
substring (*string* text [ FROM *start* integer ] [ FOR *count* integer ] ) → text
Această funcție preia trei parametri de intrare:
- Șir (tastați text)
- FROM start (tastați număr întreg)
- FOR count (tip întreg)
Subșir returnează o parte a textului de intrare, începând de la începe caracter și se oprește după număra caractere. De exemplu:
substring('Thomas' from 2 for 3) → hom
substring('Thomas' from 3) → omas
substring('Thomas' for 2) → Th
Această funcție este aceeași cu subșir:
substr ( *string* text, *start* integer [, *count* integer ] ) → text
substr('alphabet', 3) → phabet
substr('alphabet', 3, 2) → ph
Notă
Dacă sunteți familiarizat cu funcțiile, veți fi observat că prima versiune utilizează cuvinte cheie în loc de virgule pentru a separa argumentele. PostgreSQL oferă ambele versiuni ale acestor funcții.