Zoals in de meeste databases, kunnen we een reeks zinnen aan elkaar rijgen SQL en behandel ze als een eenheid van een functioneel blok; de verschillende databases beschrijven deze operatie met verschillende namen, opgeslagen procedures, modules, macro's, enz.
In PostgreSQL ze worden functies genoemd. Afgezien van het verenigen van verschillende SQL-instructies, geven deze functies ons ook de mogelijkheid om SQL-instructies uit te voeren met behulp van proceduretalen (PL).
In PostgreSQL we hebben hiervoor meerdere mogelijkheden en de mogelijkheid om deze uit te breiden.
1. PostgreSQL-functies
Anatomie van een functie
Ongeacht de taal die wordt gebruikt om de functies te schrijven, ze hebben een structuur, deze structuur kan worden gesynthetiseerd met het volgende:
CREATE OF VERVANG FUNCTIE func_name (arg1_arg1datatype) RETURNS some_type / setoff sometype / TABLE / (…) / AS $$ BODY off function $$ LANGUAGE language_of_functionAls we beschrijven wat we zien, is het vrij eenvoudig, CREER OF VERVANG FUNCTIE is de functie-aanmaakclausule, func_name is de naam die arg1 zal hebben is de parameter die het zal ontvangen en arg1_datatype is het type data dat de parameter is, dat wil zeggen, als het een geheel getal, een string, enz. is. In GEEFT TERUG We retourneren het resultaat van onze functie, $$ is het begin van het blok dat plaats zal maken voor de hoofdtekst van de functie en eindigt dan hetzelfde met $$ en tenslotte TAAL stelt ons in staat om de taal te specificeren waarin de functie is geschreven.
Het is een goed gedefinieerde en goed leesbare structuur, dus we zouden geen problemen moeten hebben met het maken van onze functies.
Functies schrijven met SQL
Schrijf de functies met SQL Het is vrij eenvoudig en snel, het is om onze SQL-instructies in principe te nemen en de kop- en voettekst van de functies eraan toe te voegen en we zijn klaar.
Maar zoals al het andere gaat dit ten koste van enkele opofferingen, we verliezen bijvoorbeeld de flexibiliteit dat als we met een andere taal zouden kunnen werken om meer takken van voorwaardelijke uitvoeringscontrole te creëren, we niet meer dan één SQL-instructie kunnen hebben, hoewel dit kan worden verholpen met behulp van verschillende methoden.
Het grootste voordeel is dat aangezien SQL de planner is PostgreSQL stelt ons in staat om te profiteren van de indexen en zo de uitvoering ervan te versnellen, aan de andere kant met andere talen zal de functie altijd een zwarte doos zijn
Laten we nu eens kijken naar een functie geschreven met SQL:
MAAK OF VERVANG FUNCTIE ins_logs (param_user_name varchar, param_description text) RETURNS integer AS $$ INSERT INTO logs (user_name, description) WAARDEN ($ 1, $ 2) RETOURNEREN log_id; $$ TAAL 'sql' VLUCHTIG;We zien dat we de structuur volgen die hierboven en aan het einde in de sectie is gedefinieerd: TAAL we definiëren 'sql'-clausule VLUCHTIG Dat het de eigenaar is, betekent dat de functie bij elke aanroep iets anders kan retourneren, zelfs als deze dezelfde parameters ontvangt. Om vervolgens onze functie aan te roepen, kunnen we gebruiken:
SELECT ins_logs ('lhsu', 'dit is een test') Als new_id;We maken een zin KIES, de functie is actief en wat we teruggeven is wat we zullen ontvangen en in dit geval zullen we een waarde zien die we new_id noemen en die de functie retourneert als log_id.
We kunnen zelfs een functie gebruiken om een recordupdate uit te voeren en een ongeldige parameter terug te geven, zoals in dit voorbeeld:
CREATE OF VERVANG FUNCTIE upd_logs (log_id integer, param_user_name varchar, param_description text) RETURNS void AS $$ UPDATE logs SET user_name = $ 2, description = $ 3, log_ts = CURRENT_TIMESTAMPWHERE log_id = $ 1; $$ LANGUAGEVOL 'sql's ' VLUCHTIG 'Omdat we ongeldig zijn, hebben we geen ontvangerveld nodig, dus voeren we het als volgt uit:
SELECT upd_logs (12, 'gewaad', 'Verander in regina');Hier kunnen we zien dat we de laatste stap van As new_id uit de vorige oproep hebben verwijderd.
Hiermee sluiten we deze tutorial af, we kunnen nu onze basisfuncties doen in SQL, waardoor veel activiteiten die we mogelijk nodig hebben binnen een programma of systeem dat we aan het bouwen zijn, worden vergemakkelijkt en vereenvoudigd.
2. PostgreSQL-functies in andere talen
Een van de meest aantrekkelijke kenmerken van PostgreSQL is dat het niet alleen beperkt is tot SQL-taalDankzij het laden van modules kunnen we ervoor kiezen om geavanceerde functionaliteiten op te nemen, waaronder de mogelijkheid om verschillende talen te gebruiken om functies te bouwen, hiermee kunnen we een grote flexibiliteit bereiken met behulp van betere generatiemogelijkheden van conditionals en de voordelen die inherent zijn aan de verschillende talen.
Schrijffuncties met PL / pgSQL
Op het moment dat we merken dat de SQL-standaard tekort schiet voor de queries die we in een functie willen uitvoeren, kunnen we altijd nog terugvallen op het gebruik van PL/pgSQL; een van de verschillen en verbeteringen met betrekking tot SQL is dat lokale variabelen kunnen worden gedeclareerd met behulp van de DECLARE-instructie, we kunnen ook controle hebben over de stroom en we moeten de hoofdtekst van de functie insluiten in een BEGIN END-blok.
Laten we een voorbeeld bekijken van een functie die in deze taal is geschreven:
MAAK FUNCTIE sel_logs_rt (param_user_name varchar) RETURNS TABLE (log_id int, gebruikersnaam varchar (50), beschrijvingstekst, log_ts timestamptz) AS $$ BEGIN RETURN QUERY SELECT log_id, gebruikersnaam, beschrijving, log_ts FROM logs param_user_name =; EINDE; $$ TAAL 'plpgsql' STABIEL;Laten we nu eens kijken hoe we functies kunnen schrijven met Python.
Functies schrijven met Python
Python is een redelijk schone programmeertaal, die een groot aantal bibliotheken beschikbaar heeft.
PostgreSQL is de enige database-engine waarmee u Python kunt gebruiken om functies te bouwen.
Om de mogelijkheid te krijgen om functies met Python te maken, moeten we er eerst voor zorgen dat we de taal op onze server hebben geïnstalleerd. Zodra we weten dat we het hebben geïnstalleerd, moeten we de extensies binnen PostgreSQL inschakelen met behulp van de volgende opdrachten:
MAAK UITBREIDING plpython2u; MAAK UITBREIDING plpython3u;We moeten ervoor zorgen dat Python actief is voordat we de extensies inschakelen om fouten te voorkomen.
Basisfuncties met Python
Zodra we alles hebben geactiveerd om Python te kunnen gebruiken, gaan we onze functie bouwen, het is belangrijk om te weten dat PostgreSQL zijn datatypes kan converteren naar Python-datatypes en vice versa. PL / Python is zelfs in staat om arrays en samengestelde typen te retourneren.
Laten we hieronder een functie zien die een tekstzoekopdracht uitvoert in een online bron, iets dat niet kon met PL / pgSQL, in de volgende afbeelding zullen we de code zien en dan zullen we de bijbehorende uitleg doen.
- We importeren de bibliotheken die we gaan gebruiken.
- We zoeken op internet door de invoerparameters van de gebruiker samen te voegen.
- We lezen het antwoord en slaan het op in een HTML-bestand met de naam raw_html.
- We slaan het deel van de HTML op dat begint met en eindigt voor het begin van.
- We verwijderen de HTML-tags en witruimte en slaan de variabele met de naam resultaat opnieuw op.
- We sturen het eindresultaat terug.
- Een ander interessant kenmerk van het gebruik van Python is dat we rechtstreeks kunnen communiceren met het besturingssysteem, laten we eens kijken naar een functie die een directorylijst maakt, er moet worden opgemerkt dat dit moet worden gemaakt door een superuser:
CREER OF VERVANG FUNCTIE list_incoming_files () RETURNS SETOF text AS $$ import os return os.listdir ('/inkomend') $$ TAAL 'plpython2u' VLUCHTIGE VEILIGHEID DEFINER;Wat is het nut hiervan? We kunnen ons afvragen, want stel je voor dat we de bestanden willen raadplegen die we in een systeem beschikbaar hebben, de aanroep van de functie zou ongeveer als volgt zijn:
SELECT bestandsnaam FROM list_incoming_files () Als bestandsnaam WHERE bestandsnaam ILIKE '% .csv'Hiermee sluiten we deze tutorial af, we behandelen het maken van functies in andere talen al in PostgreSQL, wat ons een oneindig veld geeft als het gaat om het vervullen van onze eisen.