[MariaDB 10] Stored Procedures mit viel Input

The_Akki

Neuer Benutzer
Beiträge
3
Hallo zusammen,

ich spiele gerade mit MariaDB herum und möchte eine StoredProcedure verwenden. Als "Input" habe ich zwei Listen mit den ich arbeiten muss. Ich gehe von einer maximalen Listenlänge von 100-200 Elementen aus.

Da MariaDB keine Array als Argumente kennt fallen mir nur zwei Möglichkeiten ein die Werte zu übergeben.

1) String mit Trennzeichen.
Diesen String in der SP zerlegen und dann verarbeiten. Finde ich persönlich nicht wirklich toll.

2) Temporäre Tabelle
Vorher eine Temporäre Tabelle anlegen und füllen. Die Prozedur greift dann auf die temporäre Tabelle zu.
An der Stelle stellt sich für mich die Frage. Wie "teuer" ist das erstellen einer temporären Tabelle?
Ich habe von 2 Engines gelesen, die dafür in Frage kommen können Aria und Memory. Welche würdet ihr verwenden? Spielt es überhaupt eine Rolle, wenn ich die Tabelle nur temporär anlege?
An der Stelle stört mich eigentlich nur, dass ich implizit ein Tabellendesign erwarte, welches auch vollkommen anders aussehen könnte.

Oder gehe ich die Sache falsch an? - Wie würdet ihr dies realisieren?

Grüße
The_Akki
 
Werbung:
Hallo zusammen,

ich spiele gerade mit MariaDB herum und möchte eine StoredProcedure verwenden. Als "Input" habe ich zwei Listen mit den ich arbeiten muss. Ich gehe von einer maximalen Listenlänge von 100-200 Elementen aus.

Da MariaDB keine Array als Argumente kennt fallen mir nur zwei Möglichkeiten ein die Werte zu übergeben.

tl;dr

Oder gehe ich die Sache falsch an? - Wie würdet ihr dies realisieren?

Grüße
The_Akki

Falsches Spielzeug?

Code:
test=*# create or replace function zwei_arrays(char[], int[]) returns text as $$begin
  return array_to_string(array_agg(c),'') from (select unnest($1)c, unnest($2) order by 2) foo;
end;
$$language plpgsql;
CREATE FUNCTION
Time: 0,484 ms
test=*# select * from zwei_arrays(
  '{" "," "," "," "," "," ",a,a,b,c,d,e,e,e,g,h,i,i,i,k,l,L,m,n,n,o,o,P,P,Q,r,r,s,s,s,S,t,t,u}',
  '{32,23,3,27,14,18,25,19,36,21,24,38,10,29,8,22,15,30,1,28,37,13,39,2,31,5,35,33,4,12,9,34,16,6,26,11,7,17,20}'
);
  zwei_arrays
-----------------------------------------
 in PostgreSQL ist auch das kein Problem
(1 row)

Code:
test=*# select * from zwei_arrays(
  '{" "," "," "," "," ",",",!,a,a,b,c,c,e,e,e,e,f,f,h,h,i,i,K,n,n,n,n,o,r,s,u,u}',
  '{15,4,25,19,8,3,32,11,27,9,17,13,30,23,31,20,28,29,18,14,21,16,26,5,24,22,7,2,10,1,6,12}'
);
  zwei_arrays
----------------------------------
 so, nun brauch ich einen Kaffee!
(1 row)
 
Falsches Spielzeug?

Ach so, falls jemand wissen will, wie ich die 2 Eingangsarrays erzeugt habe, hier die Lösung:

Code:
-[ RECORD 1 ]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
array_agg | {" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," ",_,_,_,_,_,_,",",",",",",",",;,!,',',',',(,(,(,(,(,(,(,),),),),),),),a,a,a,a,a,a,a,a,a,a,b,b,b,b,b,c,c,c,c,c,c,c,c,c,d,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,e,f,f,f,f,f,g,g,g,g,g,h,h,i,i,i,K,l,l,l,l,l,l,m,m,m,n,n,n,n,n,o,o,o,o,o,o,o,o,o,p,p,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,s,s,s,s,s,t,t,t,t,t,t,u,u,u,v,w,x,y,y,y}
array_agg | {154,150,34,39,113,163,128,134,160,147,50,86,167,73,117,71,165,68,78,7,63,47,21,124,102,27,99,13,93,54,112,143,20,49,171,141,109,145,144,142,61,17,31,40,69,108,79,146,149,33,166,70,19,62,22,8,14,11,28,104,25,170,120,136,168,161,118,105,58,122,148,126,48,18,164,84,45,5,157,107,2,4,42,44,59,66,81,83,88,90,129,132,139,140,158,137,138,35,74,151,29,89,15,16,30,123,127,130,125,97,135,106,82,169,3,43,96,57,77,38,114,116,131,133,55,101,37,76,111,155,52,64,153,152,95,92,23,87,10,67,9,72,60,119,75,51,36,32,156,159,24,110,41,94,1,80,85,100,46,103,6,98,121,56,115,65,53,91,12,162,26}

Damit einfach die Funktion aufrufen.

*Grins*
 
Hi,
vielen Dank für den Vorschlag PG zu benutzen. Aber ich habe die Frage bewusst in den MySQL Zweig und nicht in den PG Zweig geschrieben.

Hat jemand eine Idee wie man das Problem mit MariaDB lösen würde?

Gruß
The_Akki
 
Hängt das nicht eher von deinen Anforderungen ab?
Wenn du Datenimport als generelles Problem täglich auf deiner To-Do hast... Dann bastel dir einfach eine skalierbare Applikation die CSV-Dateien lesen kann und Variablen-formatierung/Mapping "versteht" um eine SP aufzurufen.
Wenn du Daten nur in Einzelfällen importieren musst ist eine SP, die ein String anhand gewisser Trennzeichen splittet wahrscheinlich die einfachste und schnellste Lösung :)
 
Werbung:
Ich bekomme die Daten im XML-Format als String übergeben. Das heißt ich habe eine C++ Komponente die den XML String parsed und die entsprechende SQL Abfrage aufbereitet.
Die Komponente läuft auf einen anderen Rechner als die MariaDB.
 
Zurück
Oben