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

User Defined Functions (UDF) - wie funktioniert das?

Dieses Thema im Forum "SQLite" wurde erstellt von Wolf-Tilmann, 6 August 2013.

  1. Wolf-Tilmann

    Wolf-Tilmann Aktiver Benutzer

    Einen schönen guten Morgen,

    momentan quäle ich mich, neben der Schwüle, mit UserDefinedFunctions herum.

    Soweit ich gelesen habe, kann man in SQLite eigene Funktionen erstellen. Formuliert in PHP.

    Als Datenbank-GUI verwende ich SQLite Manger in Firefox. Dort sind drei Funktionen vorformuliert.
    Z.B.:
    Code:
    // name = addAll
    // argLength = -1
    // enabled = 1
    function addAll(aValues) {
    var sum = 0;
    for (var j = 0; j < aValues.numEntries; j++) {
    sum += aValues.getInt32(j);
    }
    return sum;
    }
    
    Jetzt habe ich versucht eigene UDF zu definieren.
    Hier einmal die einfachste:
    Code:
    function sinus(aValues) {
    var sinus = 0;
    for (var j = 0 ; j > aValues.numEntries; j++) {
    sinus = sin(aValuesgetInt32(j));
    }
    return sinus;
    }
    
    Oder
    Code:
    function zehnplus(aValues) {
    var zahl = 0;
    for ( j = 0 ; j < aValues.numEntries; j++) {
    zahl = aValues;
    zahl = zahl + 10;
    }
    return zahl;
    }
    
    Kann mir jemand etwas - leicht verständliches - nennen, wo ich mich da einarbeiten kann?

    Vielen Dank
    Wolf-Tilmann
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Was passiert denn bei Deinen 2 Versuchen? beim ersten könnt ich mir vorstellen, daß es nicht funktioniert, weil bei sin(aValuesgetInt(j)) wohl ein Punkt fehlt.
    Beim 2. Versuch könnte ich mir vorstellen, daß es nicht geht, falls wie in den anderen Beispielen da mehr als ein Wert übergeben wird, also aValues kein einzelner Wert ist sondern eine Liste oder Array oder sowas. Die gezeigte Beispiel-Funktion von Dir macht eine Aggregation "Summiere alle Zahlen zusammen", Du versuchst offenbar zu sagen "Berechne von allen Zahlen jeweil den Sinus" oder "Addiere zu allen Zahlen 10 dazu". Da bekommst bzw. erwartest Du dann, daß so viele Zahlen aus der Funktion wieder rausfallen wie Du reinwirfst. Das ist bei der Aggregationsfunktion nicht der Fall.

    Aber ich kenne mich mit SQLlite nicht aus, sorry. Vielleicht hilft Dir http://php.net/manual/de/function.sqlite-create-function.php weiter.
    Nach kurzer googelei glaube ich aber, SQLlite führt diese Funktionen nicht in dessem Kontext aus, sondern das scheint mir eher eine Frage der Client-Applikation zu sein: SQLLite liefert die Werte an den Client, dieser verarbeitet das dann. Insofern sind das für mich keine 'Stored Procedures' wie man das z.B. in PostgreSQL oder anderen DB-Systemen kennt.
     
  3. Wolf-Tilmann

    Wolf-Tilmann Aktiver Benutzer

    Also bei beiden Versuchen geht nichts.
    Dann habe ich einmal etwas ausprobiert. Auf meinem Webserver habe ich SQLiteManger instelliert und dort eine Funktion gebastelt:
    Code:
    Name : zahlde
    Type : Funktion
    Funktion : <?php
    function zahlde($zahl) {
    return(number_format($zahl,2,',','.'));
    }
    ?>
    Anzahl Argumente : 1
    
    Das funktioniert mit SQLitemanager genau, so wie es soll.

    Als Standardanwendung verwende ich jedoch die Firefox-Erweiterung SQLite Manager. Dort gibt es auch UDF.
    Dort mit Copy und Paste kopiert. Lediglich $zahl durch aValues ersetzt:
    Fehlermeldung: unbekannte Funktion.

    Es muss sich also um einen "Bug" im SQLite Manger handeln.

    Einen schönen Abend
    Wolf-Tilmann
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Vermutlich nicht. $Variable ist was anderes als Variable. In Deiner oben gezeigten Funktion zahlde() sehe ich auch jetzt nicht wirklich einen Bezug zu einer Datenbank. Du übergibst lediglich eine Zahl und bekommst diese wieder zurück, nur formatiert. Eine 'Stored Procedure' im Kontext einer Datenbank ist für mich etwas, was im Kontext der Datenbank etwas mit den in der Datenbank gespeicherten Daten macht, ohne dabei mit einer Client-Applikation zu interagieren.
     
  5. Wolf-Tilmann

    Wolf-Tilmann Aktiver Benutzer

    Ist mir klar, SQLite Manger lässt als übergebbare Variable ausschließlich "aValues" zu. OHNE "$"!
    Ich denke einmal es dürfte u.a. daran liegen, dass die Funktion in der WebGUI funktioniert, im BrowserAdd nicht.
    Wie geschrieben, die Funktion addAll ist als Beispiel einer UDF in SQLite Manger hinterlegt.
    funktioniert:
    SQLitemanager_UDF.PNG
    funktioniert Original in SQLite Manager:
    SQLitemanager_UDF_.PNG
    funktioniert nicht:
    SQLitemanager_UDF_nein.PNG

    Gruß
    Wolf-Tilmann
     
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