Linux-Magazin_-_Januar_2019

(singke) #1
Die Variable »sql_mode« gibt es schon
seit Längerem in Maria DB und sie hat
sicher auch schon das eine oder andere
Mal für Verwirrung oder gar Ärger ge-
sorgt. Nun gibt es auch da Neuigkeiten.

Mehr Oracle-Kompatibilität


Mit Version 10.3 versteht die Datenbank
ein Subset der Oracle-PL/ SQL-Sprache zu-
sätzlich zum traditionellen MySQL-SQL/
PSM-Sprachschatz für Stored Rou tines,
wenn der Admin zuvor den SQL-Mode
auf »Oracle« gesetzt hat. Das Feature zielt
klar drauf ab, Oracle-DB-Nutzern die Mi-
gration auf Maria DB zu erleichtern. Es
soll von einer großen asiatischen Bank
gesponsert worden sein.
Den SQL-Mode kann der DBA auch ad
hoc auf der Kommandozeile ändern. Für
den produktiven Betrieb empfiehlt es sich

aber, sich pro Maria DB-Instanz entweder
für den alten Maria-DB- oder den neuen
Oracle-Modus zu entscheiden. Als klei-
nes Beispiel zeigt Listing 6 einen anony-
men Oracle-PL/ SQL-Block in Maria DB.
Weitere Beispiele finden sich unter [1].

Stored Aggregate Functions


Aggregate Functions sind Funktionen, die
Berechnungen über eine Gruppe von Zei-
len anstellen und anschließend nur ein
Resultat für die ganze Gruppe zurücklie-
fern. Beispiele von bereits vorhandenen
Aggregate Functions sind »COUNT()«,
»AVG()« oder »SUM()«. Mit den Stored
Aggregate Functions bietet Maria DB
jetzt die Möglichkeit, eigene Funktionen
nach diesem Vorbild zu implementieren
(Listing 7).
Die Abfrage in diesem Beispiel ließe sich
natürlich wesentlich einfacher über ein
simples »COUNT(*)« abbilden. Doch
lassen sich mit den aggregierten Stored
Functions wesentlich komplexere Kons-
trukte bilden (beispielsweise ein geome-
trisches Mittel).

Neues in Sachen SQL


Auch bei den SQL-Befehlen hat sich Ma-
ria DB weiter den Standards angenähert.
Neuerdings kann sie bei »DELETE«-State-
ments, die auf sich selbst referenzieren,
Zeilen löschen. Was früher noch zu dem
Fehler
ERROR 1093 (HY000): You can't specify U
target table 'customer' for update in U
FROM clause

Mit den Befehlen »ALTER SEQUENCE«
und »DROP SEQUENCE« ist es möglich,
die Sequenz zu modifizieren oder wieder
zu löschen. Und mit den Anweisungen
aus Listing 5 lässt sich schlussendlich
noch abfragen, wie häufig eine be-
stimmte Sequenz erstellt, geändert oder
gelöscht worden ist.

01 SQL> INSERT INTO test
02 VALUES (NEXTVAL(demo_seq), 'Some data', NULL);
03
04 SQL> SELECT * FROM test;
05 +‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+
06 | id | data | ts |
07 +‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+
08 | 10 | Some data | 2018‑09‑10 17:19:13 |
09 +‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+

Listing 4: Eine Sequenz nutzen

01 SQL> SHOW GLOBAL STATUS
02 LIKE '%seq%';
03 +‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑+
04 | Variable_name | Value |
05 +‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑+

06 | Com_alter_sequence | 0 |
07 | Com_create_sequence | 2 |
08 | Com_drop_sequence | 1 |
09 +‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑+

Listing 5: Informationen zu einer Sequenz

01 SQL> SELECT @@session.sql_mode INTO
@old_sql_mode;
02 SQL> SET SESSION sql_mode=ORACLE;
03
04 SQL> DELIMITER /
05
06 SQL> BEGIN

07 SQL> SELECT 'Hello world from Maria DB
anonymous PL/SQL block!';
08 SQL> END;
09 SQL> /
10
11 SQL> DELIMITER ;
12 SQL> SET SESSION sql_mode=@old_sql_mode;

Listing 6: PL/ SQL-Block in Maria DB

01 SQL> CREATE TABLE marks (
02 `student` VARCHAR(17)
03 , `grade` TINYINT UNSIGNED
04 );
05
06 SQL> INSERT INTO marks VALUES ('Alena', 6),
('Milva', 4), ('Marino', 5), ('Pablo', 5),
('Leo', 6);
07 INSERT INTO marks VALUES ('Alena', 5),
('Milva', 4), ('Pablo', 6), ('Leo', 2);
08 INSERT INTO marks VALUES ('Alena', 4),
('Milva', 3), ('Marino', 6), ('Pablo', 5),
('Leo', 4);
09
10 SQL> SELECT * FROM marks;
11

12 SQL> DELIMITER //
13
14 SQL> CREATE AGGREGATE FUNCTION agg_count(
x INT) RETURNS INT
15 BEGIN
16 DECLARE count_students INT DEFAULT 0;
17 DECLARE CONTINUE HANDLER FOR NOT FOUND
18 RETURN count_students;
19
20 LOOP
21 FETCH GROUP NEXT ROW;
22 IF x THEN
23 SET count_students = count_students + 1;
24 END IF;
25 END LOOP;
26 END;

27 //
28
29 SQL> DELIMITER ;
30
31 SQL> SELECT student, agg_count(5) AS 'tests'
32 FROM marks GROUP BY student;
33 +‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑+
34 | student | tests |
35 +‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑+
36 | Alena | 3 |
37 | Leo | 3 |
38 | Marino | 2 |
39 | Milva | 3 |
40 | Pablo | 3 |
41 +‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑+

Listing 7: Eigene Aggregatfunktionen

Sysadmin

68


http://www.linux-magazin.de

Maria DB 10.3
Free download pdf