Benutzer definierte Funktion erstellen

Astudent

Benutzer
Beiträge
5
Guten Abend,

wollte über MariaDB eine Benutzer definierte Funktion erstellen. Etwas kleines, die Funktion soll ein Text ausgeben.

MariaDB [test]> CREATE FUNCTION hello_world(addresse TEXT)
-> RETURNS TEXT
-> BEGIN
-> RETURN CONCAT ('Hello', addresse); END;

Die funktion lässt sich irgendwie nicht erstellen kriege jedesmal die selber Fehlermeldung.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 4
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'END' at line 1

Was habe ich falsch gemacht? Kann mir jemand helfen?
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    22 KB · Aufrufe: 2
Werbung:
Hrm. Suchst sowas, nur in PostgreSQL?

Code:
test=*# select * from astudent ;
 adresse
---------
 max
 susi
(2 rows)

test=*# create or replace function hello_world(a text) returns text as $$begin return 'Hallo ' || a; end; $$ language plpgsql;
CREATE FUNCTION
test=*# select *, hello_world(adresse)  from astudent ;
 adresse | hello_world
---------+-------------
 max     | Hallo max
 susi    | Hallo susi
(2 rows)

test=*#
 
Nein, mir geht es eher darum warum ich diese Fehlermeldung kriege. Jedes mal wenn ich eine Funktion schreibe, sei es die Funktion oben oder eine zum addieren von zwei Zahlen oder eine aus dem Netz kriege ich diese Meldung.

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 4
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'END' at line 1
 
Trotzdem vielen Dank. Bin jetzt ein Schritt weiter. habe eine Tabelle buecher erstellt und eine autor.
+------+------+---------------------------------+------------+-----------+
| ISBN | vid | titel | jahr | exemplare |
+------+------+---------------------------------+------------+-----------+
| 1 | 1 | hans im glück | 2004-12-01 | 1 |
| 2 | 2 | fahrenheit 451 | 2001-01-14 | 4 |
| 3 | 3 | DRAGONBALL 42 | 2000-10-01 | 12 |
| 4 | 4 | herr der ringe | 2004-12-15 | 6 |
| 5 | 5 | grundlagen der regelungstechnik | 2015-08-01 | 10 |
| 6 | 6 | mathe für dummies | 2008-06-30 | 2 |
| 7 | 7 | regelungstechnik für dummies | 2017-07-30 | 12 |
+------+------+---------------------------------+------------+-----------+

+-----+----------------+
| aid | name |
+-----+----------------+
| 1 | hans jürgen |
| 2 | ray bradburry |
| 3 | akira toriyama |
| 4 | j.r.r. tolkien |
| 5 | a.bunzemeier |
| 6 | a.bunzemeier |
+-----+----------------+

die Tabellen sehen ungefähr so aus. habe hierzu eine funktion geschrieben um mir die bücher ausgeben zu lassen von autor x. spricht ich gebe den namen des autors in die funktion ein und möchte dann die bücher ausgegeben kriegen.


CREATE FUNCTION autors(name VARCHAR(55))
-> RETURNS VARCHAR(55)
-> RETURN (SELECT titel FROM buecher JOIN autor ON buecher.ISBN=autor.aid WHERE name='name');
-> //

So jetzt habe ich folgendes Problem gebe ich den namen ein kriege ich statt des titels den Wert null zurück. Das ist nicht das gewünschte Ergebnis. kannst du mir eventuell weiterhelfen oder jemand anders.

MariaDB [test]> SELECT autors('a.bunzemeier');
-> //
+------------------------+
| autors('a.bunzemeier') |
+------------------------+
| NULL |
+------------------------+
 
Das ist gruselig...

  • ISBN (International Standard Book Number) hat ein anderes Format als das in Deiner Tabelle 'buecher'. Richtige Datenbanken haben eigene Typen für ISBN's.
  • Du joinst über buecher.ISBN = Autor.Id? Hä?
  • Deine Autoren-Tabelle enthält Duplikate
  • WHERE name='name', siehste selber, oder?

ich würde empfehlen, das komplett zu entsorgen. Im nächsten Versuch geich mal eine richtige DB nehmen, und richtige Datentypen. Der Versuch, typische Abfragen via Funktionen in eine Art API zu kapseln ist ja nicht wirklich falsch, aber hier a) etwas überdimensioniert und b), again, falsche DB. Aber, ganz wichtig: überlege Dir, wie was zusammenhöngt. Hint: ISBN und Autor sind unterschiedliche Dinge. Zu einer ISBN können mehrere Autoren gehören, ein Autor kann Bücher mit mehreren ISBN's geschrieben haben, und ISBN's sehen anders aus. Zum Beispiel: 'ISBN 978-1-78847-492-4'. Ist übrigens lesenswert, von meinen Kollegen geschrieben.
 
vielen dank für den hinweis. habe die tabellen noch mal neu erstellt. das ganze sieht in etwa so aus.


tabelle mitglieder
+-----+-----------+---------+
| mid | name | vorname |
+-----+-----------+---------+
| 1 | weber | peter |
| 2 | schneider | bern |
+-----+-----------+---------+

tabelle buecher
+-----+-----------------+----------------+------+------+-----------+
| bid | ISBN | titel | jahr | vid | exemplare |
+-----+-----------------+----------------+------+------+-----------+
| 1 | 987-63638-635-1 | dragonball 42 | 2001 | 1 | 8 |
| 2 | 987-63638-635-2 | fahrenheit 451 | 1998 | 2 | 3 |
+-----+-----------------+----------------+------+------+-----------+

habe jetzt eine einfach funktion erzeugt die mir die exemplare der bücher ausgeben soll bei eingabe des titels.

CREATE FUNCTION anzahl ($titel VARCHAR(55)) RETURNS INT
-> RETURN (SELECT exemplare FROM buecher WHERE titel='$titel');
-> //

ergebnis:

select anzahl('dragonball 42');
-> //
+-------------------------+
| anzahl('dragonball 42') |
+-------------------------+
| NULL |
+-------------------------+

problem wurde leider nicht behoben. mache ich eine eine such abfrage ohne benutzer definierte funktion kriege ich das gewünschte ergebnis raus.

select exemplare from buecher where titel='dragonball 42';
-> //
+-----------+
| exemplare |
+-----------+
| 8 |
+-----------+

verstehe echt nicht wo der fehler meinerseits liegt. wieso gibt mir die funktion einen wert von null aus?
 
verstehe echt nicht wo der fehler meinerseits liegt.
vermutlich an der Benamung Deiner Variablen.

wieso gibt mir die funktion einen wert von null aus?

Es gibt offenbar kein Buch mit dem Titel '$titel'.

Code:
test=*# create table buecher(titel text, anzahl int);
CREATE TABLE
test=*# create or replace function anzahl(_titel text) returns int as $$begin return (select anzahl from buecher where titel = _titel); end;$$language plpgsql;
CREATE FUNCTION
test=*# select anzahl('testbuch');
 anzahl
--------
       
(1 row)

test=*# insert into buecher values('test 1', 10);
INSERT 0 1
test=*# insert into buecher values('testbuch', 20);
INSERT 0 1
test=*# select anzahl('testbuch');
 anzahl
--------
     20
(1 row)

test=*#

select Kaffee!
 
Deine WHERE-Bedingung sieht immernoch falsch aus. Du setzt dort die Variable $titel in Hochstriche, die müssten weg.
WHERE titel=$titel
Die Striche schließen nur Zeichenketten ein.
 
Vielen Dank für eure Unterstützung. Es funktioniert lag an der WHERE bedingung.

Nächste Frage ist es möglich zwei rückgabewerte in einer funktion zu erhalten? möchte die funktion so erweitern das ich nicht nur die anzahl der exemplare zurückkriege sondern auch die isbn nummer und eventuell das jahr?

CREATE FUNCTION anzahl ($titel VARCHAR(55)) RETURNS INT
-> RETURN (SELECT exemplare, ISBN, jahr FROM buecher WHERE titel=$titel);
-> //

Die Funktion lässt sich erstellen aber bei der ausführung kriege ich folgende Meldung.
MariaDB [p4]> select anzahl('dragonball 42');
-> //
ERROR 1241 (21000): Operand should contain 1 column(s)
 
Nächste Frage ist es möglich zwei rückgabewerte in einer funktion zu erhalten?

Jupp.

Code:
test=*# create or replace function my_function (x int, out y int, out z int) as $$ begin y := x+2; z:=y+3; end; $$ language plpgsql;
CREATE FUNCTION
test=*# select my_function(5);
 my_function
-------------
 (7,10)
(1 row)

test=*#
 
Werbung:
Zurück
Oben