Modulelessen (1/4)
UDF's en basis-SQL
Tot nu toe hebben we vragen verzonden vanaf de Node.js-server. Maar als een formule wordt gebruikt in tientallen verschillende zoekopdrachten (bijvoorbeeld het berekenen van de uiteindelijke prijs inclusief btw), waarom zou je de wiskunde dan in JavaScript dupliceren? SQL-functies (door de gebruiker gedefinieerde functies - UDF) laten we "macro's" maken in de database zelf.
Zo maakt u een wiskundige SQL-macro:
CREATE OR REPLACE FUNCTION calculate_tax(price NUMERIC)
RETURNS NUMERIC AS $$
SELECT price * 1.22;
$$ LANGUAGE sql;Zodra deze opdracht wordt uitgevoerd, blijft de functie voor altijd in onze database bestaan. Het kan vanuit elke zoekopdracht worden aangeroepen:
SELECT name, calculate_tax(unit_price) AS price_with_tax FROM products;Dynamische creatie
We kunnen zoveel variabelen definiëren als we willen, waarbij we hun typen specificeren, en LANGUAGE sql zal de query uitvoeren en impliciet de laatste verklaring retourneren die tussen de dollartekens $$ is geplaatst.
Probeer het zelf
Maak een eenvoudige aanroepbare functie met de naam 'get_full_name' die twee TEXT-parameters accepteert ('voornaam' TEXT, 'achternaam' TEXT).\nHet moet een TEXT-waarde retourneren.\nVoer binnenin een triviale SELECT uit die de twee argumenten samenvoegt met een enkele spatie ertussen, en declareer dit als taal-sql.
Toon hint
FUNCTIE MAKEN OF VERVANGEN get_full_name(voornaam TEXT, achternaam TEXT) RETOURNEERT TEKST ALS $$ SELECTEER voornaam || ' ' || achternaam; $$ TAAL sql;
Oplossing beschikbaar na 3 pogingen
In meer geavanceerde UDF's kunnen we hele query's insluiten. Maak een functie 'get_customer_count()' die geen parameters accepteert en een INTEGER RETOURNERT.\n Voer binnenin een triviale 'SELECT COUNT(id) FROM customers' uit.\nDeclareer het als pure SQL-taal.
Toon hint
Let op: COUNT retourneert een bigint, cast deze naar INTEGER om overeen te komen met het retourtype! FUNCTIE MAKEN OF VERVANGEN get_customer_count() RETOURNEERT INTEGER ALS $$ SELECT CAST(COUNT(id) AS INTEGER) FROM klanten; $$ TAAL sql;
Oplossing beschikbaar na 3 pogingen