Tom: MySQL: neue Funktionen selber definieren

Hello,

es gibt ja die Möglichkeit, MySQL unter bestimmten Umständen mit eigenen Funktionen zu ergänzen.
http://dev.mysql.com/doc/mysql/de/Adding_UDF.html

Hat eineR von Euch damit schon Erfahrungen gesammelt? Ich würd das gerne mal ausprobieren, auch auf die Gefahr hin, dass meine MySQL-Inatallation dann in die Dutten fährt.

Wie müsste ich den vorgehen?
Wahrscheinlich ja zuerst die "dynamische Installation herstellen"
Mus ich mich dann nochmal mit der Inatallation beschäftigen. Aber ich würde auch die letzte 3er-Version dafür nutzen wollen. Gibts die noch irgendwo?

Harzliche Grüße aus http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
  1. yo Tom,

    es gibt ja die Möglichkeit, MySQL unter bestimmten Umständen mit eigenen Funktionen zu ergänzen.

    wie du weißt, komme ich ja weniger aus der mysql-welt, sondern bin oracler. deswegen bin ich immer ein wenig unsicher, was die vielen mysql fragen hier betrifft. mit den fragen lerne ich quasi immer mehr von mysql. aber unter oracle ist das erstellen eigener funktionen und prozeduren so normal wie der morgendliche kaffee. du deklarierst sie und benutzt sie dann ganz normal über ihren namen. das betrifft dann nicht nur sql statements, sondern ich kann sie dann zum beispiel auch beim sql@loader einsetzen.

    insofern würde es mich stark verwundern, wenn man nicht eigene funktionen unter mysql schreiben kann, ohne gleich das dbms zu zerschießen. das sollte eigentlich was gant alltägliches sein....

    Ilja

    1. wie du weißt, komme ich ja weniger aus der mysql-welt, sondern bin oracler. deswegen bin ich immer ein wenig unsicher, was die vielen mysql fragen hier betrifft. mit den fragen lerne ich quasi immer mehr von mysql. aber unter oracle ist das erstellen eigener funktionen und prozeduren so normal wie der morgendliche kaffee. du deklarierst sie und benutzt sie dann ganz normal über ihren namen. das betrifft dann nicht nur sql statements, sondern ich kann sie dann zum beispiel auch beim sql@loader einsetzen.

      du meinst wirklich UDFs und nicht SP?
      kannst du mal so ein UDF von dir aufzeigen? ich war bisher nicht genötigt, eigene UDFs zu erstellen.

      1. Hello,

        wie du weißt, komme ich ja weniger aus der mysql-welt, sondern bin oracler. deswegen bin ich immer ein wenig unsicher, was die vielen mysql fragen hier betrifft. mit den fragen lerne ich quasi immer mehr von mysql. aber unter oracle ist das erstellen eigener funktionen und prozeduren so normal wie der morgendliche kaffee. du deklarierst sie und benutzt sie dann ganz normal über ihren namen. das betrifft dann nicht nur sql statements, sondern ich kann sie dann zum beispiel auch beim sql@loader einsetzen.

        du meinst wirklich UDFs und nicht SP?
        kannst du mal so ein UDF von dir aufzeigen? ich war bisher nicht genötigt, eigene UDFs zu erstellen.

        Jein. Eigentlich würden mir SPs ausreichen. Aber da das ja wohl noch nicht geht, wäre mir die Holzhackermethode auch recht. Allerdings bezweifle ich, dass ich die gestellte Aufgabe tatsächlich lösen kann, weil si in die Objekthierarchie von MySQL eingreifen müsste, also keine seperate Funktion wie sin() oder sqrt() darstellt.

        Ich möchte eine Funktion haben, mit der man die Laufende Zeilennummer eines Querys abfragen und nutzen kann, sodass ein

        update table set querynr=123, lfdnr=row() where irgendwas...

        Das ist jetzt hier sehr verkürzt dargestellt, also fang bitte nicht an, über den Sinn DIESES Satatements zu diskutieren. Es dient nur der Verdeutlichung, wann (zeitlich) ich die Funktion einsetzen will. Also keine Aggregatsfunktion, sondern eine zur Datenmanipulation.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Jein. Eigentlich würden mir SPs ausreichen. Aber da das ja wohl noch nicht geht, wäre mir die Holzhackermethode auch recht. Allerdings bezweifle ich, dass ich die gestellte Aufgabe tatsächlich lösen kann, weil si in die Objekthierarchie von MySQL eingreifen müsste, also keine seperate Funktion wie sin() oder sqrt() darstellt.

          hey, ich meinte doch iija.

          Ich möchte eine Funktion haben, mit der man die Laufende Zeilennummer eines Querys abfragen und nutzen kann, sodass ein

          update table set querynr=123, lfdnr=row() where irgendwas...

          ja, die zeilennummern sind manchmal wirklich vonnöten.
          in deiner anforderung glaube ich aber, daß es auch anders geht.
          aber wenn man mit oracle 'seitenweise' blättern möchte, ist das nicht ganz so schön, wie es mit mysql möglich ist, da oracle ebenso wie andere dbs nicht das schöne limit von mysql kennt, sonder nur soetwas wie top oder fetch first rows only.

          aber man kann sich z.b. in oracle durch die bildung von zeilennummern per rownum (? schon zu lange her) als generierte spalte mit subselect behelfen. ist zwar etwas durch die brust ins auge, aber dann kann genauso blättern wie mit mysql limit.

    2. Hello Ilja

      gibt es bei Oracle eine Funktion, mit der man die laufende Zeilennummer eines Resultsets feststellen kann?

      update table set lfdnr=row() where irgendwas

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hallo Tom,

        gibt es bei Oracle eine Funktion, mit der man die laufende Zeilennummer eines Resultsets feststellen kann?

        Entschuldige wenn ich meinen Senf dazugeben muß. ADO bietet diese Zeilennummer mit der AbsolutePosition-Eigenschaft. Natürlich nur, wenn der Datenprovider das auch tut (SQL-Server machts).

        update table set lfdnr=row() where irgendwas

        In ADO kann man die AbsolutePosition setzen, dann ist dieser Datensatz der aktuelle.

        Beste Grüße
        Viennamade

        1. Hello,

          gibt es bei Oracle eine Funktion, mit der man die laufende Zeilennummer eines Resultsets feststellen kann?

          Entschuldige wenn ich meinen Senf dazugeben muß. ADO bietet diese Zeilennummer mit der AbsolutePosition-Eigenschaft. Natürlich nur, wenn der Datenprovider das auch tut (SQL-Server machts).

          update table set lfdnr=row() where irgendwas

          In ADO kann man die AbsolutePosition setzen, dann ist dieser Datensatz der aktuelle.

          Das verstehe ich nun wieder nicht.
          Ich will ja nicht die absolute Position in der Tabelle, sondern die relative Position im Abfrageergebnis erfragen und gleich verwenden.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. Hallo Tom!

            gibt es bei Oracle eine Funktion, mit der man die laufende Zeilennummer eines Resultsets feststellen kann?

            Entschuldige wenn ich meinen Senf dazugeben muß. ADO bietet diese Zeilennummer mit der AbsolutePosition-Eigenschaft. Natürlich nur, wenn der Datenprovider das auch tut (SQL-Server machts).

            update table set lfdnr=row() where irgendwas

            In ADO kann man die AbsolutePosition setzen, dann ist dieser Datensatz der aktuelle.

            Das verstehe ich nun wieder nicht.
            Ich will ja nicht die absolute Position in der Tabelle, sondern die relative Position im Abfrageergebnis erfragen und gleich verwenden.

            Ja, AbsolutePosition bezieht sich auf die Datensätze im Resultset, mit 1 beginnend bis zur Anzahl der enthaltenen Datensätze.

            Beste Grüße
            Viennamade

            1. Hello,

              Ja, AbsolutePosition bezieht sich auf die Datensätze im Resultset, mit 1 beginnend bis zur Anzahl der enthaltenen Datensätze.

              Und kann man diese dann auch in den Satz eintragen? Es geht mir ja um ein Update.

              Und wenn das dann auch noch mit MySQL funktionieren würde, wäre es super.

              Harzliche Grüße aus http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Hallo Tom,

                Ja, AbsolutePosition bezieht sich auf die Datensätze im Resultset, mit 1 beginnend bis zur Anzahl der enthaltenen Datensätze.

                Und kann man diese dann auch in den Satz eintragen? Es geht mir ja um ein Update.

                nein, ich glaube nicht daß man die AbsolutePosition(innerhalb d. Rs)-Eigenschaft des Datensatzes mit einem Befehl in den Table oder ins Resultset bekommt.

                Beste Grüße
                Viennamade

      2. yo,

        gibt es bei Oracle eine Funktion, mit der man die laufende Zeilennummer eines Resultsets feststellen kann?

        so, bin wieder da. mir ist noch nicht so ganz klar, worauf du abzielst. also ich behaupte mal mit oracle geht alles. aber das muss ich wohl auch sagen und ist sicherlich ein wenig "geflunkert". ;-)

        eine feste nummerierung bei einer query mit auszugeben ist recht einfach zu bewerkstelligen. oracle bietet dazu mehrere möglichkeiten. eine davon ist, man kann eine sequenz erzeugen. das ist ein datenbankobjekt, dass zum beispiel anstelle von auto-increment bei oracle verwendet wird. aber auch variablen sind denkbar, etc. aber wie gesagt, mir ist noch nicht ganz klar, was du erreichen willst oder suchst.

        eine eigene funktion/prozedur unter oracle ist recht einfach zu erzeugen, CREATE FUNCTION/ CREATE PROCEDURE....

        Ilja

      3. gibt es bei Oracle eine Funktion, mit der man die laufende Zeilennummer eines Resultsets feststellen kann?

        habe mal eben in altem kram rumgesucht. vielleicht hilft dir das weiter:
        <schnipp>
            function gibListe($von='', $bis='') {
                echo("<!-- ".__FILE__."->gibListe(".$von.", ".$bis.")[".__LINE__."] -->\r\n");
                global $DB_Sitzung;
                global $Format;
                //
                $sql = "SELECT UNIQUE v.SV_ORGAID, v.SV_VZID, v.ENDE_DATE, p.STATUS, "
                                    ."a.NAME, a.STRASSE, a.PLZ, a.ORT, "
                                    ."SUBSTR(a.VZID,5,3)||SUBSTR(a.ADRID,3,4) AS BetriebsNummer "
                        ."FROM STAMM_HAENDLER_VERTRAG v, STAMM_HAENDLER p, LF_OID_ADRESSE a ";
                $sql .= "WHERE v.SV_ORGAID = p.SH_ORGAID AND a.ORGAID = v.SV_ORGAID ";
                if ($this->VzWHERE) { $sql .= 'AND '.$this->VzWHERE." "; }
                if ($this->VertragWHERE) { $sql .= 'AND '.$this->VertragWHERE." "; }
                if ($von or $bis) {
                    $sql = "SELECT SV_ORGAID, SV_VZID, ENDE_DATE, STATUS, NAME, STRASSE, PLZ, ORT, BetriebsNummer, ROWNUM AS Zeile "
                            ."FROM (".$sql.")";
                    $sql = "SELECT SV_ORGAID, SV_VZID, ENDE_DATE, STATUS, NAME, STRASSE, PLZ, ORT, BetriebsNummer "
                            ."FROM (".$sql.") T1 "
                           ."WHERE T1.Zeile BETWEEN ".$von." AND ".$bis;   // PartnerListe einschränken !
                }
                echo "<!-- SQL: "; print_r($sql); echo(" -->\r\n");
        </schnipp>

        interessant ist die stelle mit ROWNUM.

        1. Hello,

          das scheint aber eine normale Spaltenbezeichnung zu sein.

          Harzliche Grüße aus http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          1. das scheint aber eine normale Spaltenbezeichnung zu sein.

            ROWNUM ist definitiv keine spalte aus der tabelle, sondern eine variable, welche von oracle bereitgestellt wird, und die laufende zeilennummer liefert.
            ich benutze diese variable, um die zeilen 'durchzunummerieren', damit ich dann zum blättern von-bis sagen kann.

            1. yo,

              ROWNUM ist definitiv keine spalte aus der tabelle, sondern eine variable, welche von oracle bereitgestellt wird, und die laufende zeilennummer liefert.

              rownum ist eine interne spalte von oracle, die bei jeder tabelle automatisch angeleget wird und somit jeder datensatz eine eindeutige rownum besitzt. damit kann ein datensatz eindeutig bestimmt werden. indizes besitzen zum beispiel einen verweis auf die rownum des datensatzes. auch in queries kann man sich auf diese rownum beziehen, was in der tat auch öfters gemacht wird. oftmaals wird damit versucht, eine sortierung rein zu bringen, quasi ein ersatz für limit. das geht aber nicht.

              Ilja

              1. rownum ist eine interne spalte von oracle, die bei jeder tabelle automatisch angeleget wird und somit jeder datensatz eine eindeutige rownum besitzt. damit kann ein datensatz eindeutig bestimmt werden. indizes besitzen zum beispiel einen verweis auf die rownum des datensatzes. auch in queries kann man sich auf diese rownum beziehen, was in der tat auch öfters gemacht wird. oftmaals wird damit versucht, eine sortierung rein zu bringen, quasi ein ersatz für limit. das geht aber nicht.

                genau das mache ich, ROWNUM als LIMIT ersatz zu benutzen. geht ganz vorzüglich. (siehe beispiel)