Tillbaka i MariaDB Server 10.3 lade vi till ett nytt SQL-läge (SQL_MODE=ORACLE) för att tillhandahålla kompatibilitet med en delmängd av Oracle PL/SQL, en procedurtillägg till Structured Query Language (SQL). Med den senaste versionen av MariaDB Community Server 10.6 har vi fortsatt vår resa för att utöka MariaDB:s PL/SQL-kompatibilitet genom att lägga till flera funktioner som ROWNUM()
, ADD_MONTHS()
och TO_CHAR()
. Detta är så coolt av ett antal anledningar, men till att börja med är MariaDB fortfarande den enda databasen som implementerar Oracle-kompatibilitet med öppen källkod så denna funktion är tillgänglig för alla. För att verkligen förstå vad det betyder är det viktigt för oss att ta ett kort steg tillbaka så att du vet varför vi började på den här vägen till att börja med.
Kraften i procedur- och deklarativ programmering
Genom att kombinera datamanipuleringskraften hos SQL-språket med procedurfunktioner har utvecklare en uppsjö av spännande, nya möjligheter. Med hjälp av PL/SQL har utvecklare förmågan att köra SQL-satser som fokuserar på det deklarativa tillvägagångssättet "vad man ska göra" samtidigt som de får möjligheten att kontrollera flödet av operationer, eller "hur man gör det".
Vänta, va? OK, överväg följande traditionella SQL-sats.
SELECT id, name, has_kids FROM friends;
Enkelt, elegant och effektivt. SQL är ett vackert språk, men det har sina begränsningar. Tänk till exempel om du vill gå igenom resultaten som returneras från SELECT
utförande? Och sedan, medan du analyserar resultaten, kontrollera varje resultat med en villkorlig sats (t.ex. om has_kids
är sant) så att du kan utföra specifika operationer baserat på dessa förhållanden?
Snabb anteckning :Detta är rent hypotetiskt. Jag är säker på att om du har vänner med barn och vänner utan barn så behandlar du dem på samma sätt. Men för det här exemplets skull, låt oss säga att du inte gör det. OK? Okej, kul.
Men med alla dessa iterationer och tillstånd som händer är det möjligt att du kommer att stöta på ett fel. Skulle det inte vara trevligt om du kunde hantera fel (d.v.s. undantag) direkt på databassidan, utan att först behöva returnera de ursprungliga resultaten till applikationskoden som ska behandlas? Tja, det är bara synd, eftersom du använder vanlig SQL, och ingen av dessa saker är möjliga.
Frukta inte! Följ istället med mig till den underbara världen av PL/SQL!
Genom att använda något som kallas ett PL/SQL-block kan du kombinera den SQL du känner till och älskar med de procedurfunktioner som gör att du kan kontrollera flödet av operationer med hjälp av funktioner som förmågan att deklarera variabler, hantera villkor, loop genom data, hantera undantag och så mycket mer.
PL/SQL-block hanteras inom MariaDB Server, där SQL- och procedursatserna analyseras och exekveras därefter.
Ganska coolt, eller hur? Det blir så mycket bättre! Men tillbaka till vårt tidigare exempel. Du kan använda ett enda PL/SQL-block för att åstadkomma allt jag angav tidigare.
Till exempel:
DELCARE CURSOR c IS SELECT id, name, has_kids FROM friends; BEGIN FOR friend_row IN c LOOP IF friend_row.has_kids == true THEN /* Do something */ ELSE /* Do something else */ END IF; END LOOP; EXCEPTION WHEN no_data_found THEN /* Handle no data found */ WHEN others THEN /* Handle all other kinds of exceptions */ END;
Läs mer
Kraftfulla grejer, eller hur? Tja, det här blogginlägget är egentligen bara toppen av ett isberg. Lite något för att väcka aptiten, om du så vill. Men om du vill veta mer rekommenderar jag starkt att du tittar på ett webbseminarium som vi nyligen presenterade, MariaDB och PL/SQL:Combining the Power of SQL and Procedural Statements. I den dyker vi in i mycket mer detaljer om varför vi har gjort det till vårt uppdrag att lägga till och utöka PL/SQL-stöd och vi inkluderar en mängd olika exempel och en live kodningsdemonstration, som ger dig en förstahands titt på hur du kan använda PL/SQL inom MariaDB! Lycka till med kodningen, vänner!