Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

[MariaDB 10] Stored Procedures mit viel Input

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von The_Akki, 16 März 2015.

  1. The_Akki

    The_Akki Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    tl;dr

    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)
    
     
  3. akretschmer

    akretschmer Datenbank-Guru

    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*
     
  4. The_Akki

    The_Akki Neuer Benutzer

    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
     
  5. Distrilec

    Distrilec Datenbank-Guru

    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 :)
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Woher kommen die?
     
  7. The_Akki

    The_Akki Neuer Benutzer

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden