Stored Function mit group_concat

GoatMachine

Benutzer
Beiträge
23
Hallo, ich würde gerne eine eigene Funktion erstellen, die meine SQL Befehle etwas übersichtlicher gestalten könnte und vor allem die komplette Seite Redundanzenfreier macht.

Aus diesem Grund wollte ich anfangen, aus den group_concat Funktionen die ich habe, eine Stored Function zu kreieren. Leider funktioniert das ganze nicht so wie gewollt.

Ich nutze die MariaDB in der Version 5.5.32.

Versuch 1:
PHP:
DELIMITER $$
CREATE FUNCTION SprachenListe(
paramTable VARCHAR( 50 )
) RETURNS TEXT DETERMINISTIC BEGIN
DECLARE Ausgabe TEXT;
SET @tableName = paramTable;
SELECT GROUP_CONCAT( DISTINCT @tableName.Sprache ORDER BY @tableName.Sprache SEPARATOR  '/' ) INTO Ausgabe;
RETURN(Ausgabe);
END ;
$$
DELIMITER ;
Befehl wird ausgeführt, doch wenn ich die Funktion später aufrufen will, bekomme ich nur null Werte.

Versuch 2
PHP:
DELIMITER $$
CREATE FUNCTION SprachenListe(
paramTable VARCHAR( 50 )
) RETURNS TEXT DETERMINISTIC BEGIN
DECLARE Ausgabe TEXT;
SET @tableName = paramTable;
SELECT GROUP_CONCAT( DISTINCT @tableName.Sprache ORDER BY @tableName.Sprache SEPARATOR  '/' ) INTO Ausgabe FROM @tableName;
RETURN(Ausgabe);
END ;
$$
DELIMITER ;

Diesen Befehl kann ich noch nicht einmal ausführen, dort bekomme ich direkt eine Fehlermeldung:
dot.gif
#1064 - 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 '@tableName; RETURN(Ausgabe); END' at line 6

Hat vielleicht jemand eine Idee, wo der Fehler liegt? Ich habe mich das erste mal an Stored Functions versucht.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.846
Hallo, ich würde gerne eine eigene Funktion erstellen, die meine SQL Befehle etwas übersichtlicher gestalten könnte und vor allem die komplette Seite Redundanzenfreier macht.

Aus diesem Grund wollte ich anfangen, aus den group_concat Funktionen die ich habe, eine Stored Function zu kreieren. Leider funktioniert das ganze nicht so wie gewollt.

Ich nix MySQL oder MariaDB, aber ich denke mal, wenn Du den Tabellennamen als Parameter übergibst wirst Du EXECUTE nutzen müssen.
 

GoatMachine

Benutzer
Beiträge
23
Ok, dies habe ich jetzt gemacht, aber trotzdem kommt noch ein Fehler.

PHP:
DELIMITER $$
CREATE FUNCTION SprachenListe(
paramTable VARCHAR( 50 )
) RETURNS TEXT DETERMINISTIC BEGIN 
DECLARE Ausgabe TEXT;
SET @tableName = paramTable;
EXECUTE IMMEDIATE CONCAT('SELECT GROUP_CONCAT( DISTINCT ', @tableName.Sprache, ' ORDER BY ',@tableName.Sprache,' SEPARATOR  ','/',' ) INTO ',Ausgabe,' FROM ',@tableName);
RETURN(Ausgabe);
END ;
$$
DELIMITER ;

dot.gif

dot.gif
#1064 - 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 'CONCAT('SELECT GROUP_CONCAT( DISTINCT ', @tableName.Sprache, ' ORDER BY ',@table' at line 6

Ich frage mich, was ich übersehe -.-
 

akretschmer

Datenbank-Guru
Beiträge
9.846
Ok, dies habe ich jetzt gemacht, aber trotzdem kommt noch ein Fehler.

Ich frage mich, was ich übersehe -.-

keine Ahnung...

Code:
test=*# select * from goatmachine ;
  t
------------
 kurzdemo
 in
 postgresql
(3 rows)

test=*#
test=*#
test=*#
test=*# create or replace function liste(tablename text) returns text as $$ declare ret text; begin execute E'select array_to_string(array_agg(t),\' \') from ' || tablename into ret; return ret; end;$$language plpgsql;
CREATE FUNCTION
test=*# select * from liste('goatmachine');
  liste
------------------------
 kurzdemo in postgresql
(1 row)

Andreas
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.702
Zum debuggen solltest du dir das, was in EXECUTE() an Text steht auch mal als solchen ausgeben lassen ob dort die Syntax wirklich passt.
 
Oben