Announcement

Collapse
No announcement yet.

Schreiben einer UDF

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Schreiben einer UDF

    Hallo,

    ich hab jetzt beschlossen, mir eine UDF zu schreiben, welche mir eben nur jeden 20. Eintrag einer Tabelle zurückliefert,
    Wie kann man das machen bzw. wie greife ich von einer UDF auf eine Tabelle in der Datenbank zu?

    lg

  • #2
    Eine UDF ist dafür nicht geeignet, her eine SP basierend auf meiner Testtabelle:
    [highlight="sql"]
    SET TERM ^ ;

    CREATE PROCEDURE TABELLE2JEDERXTE (
    ANZAHL INTEGER)
    RETURNS (
    ID INTEGER,
    STAMP TIMESTAMP)
    AS
    DECLARE VARIABLE I INTEGER;
    begin
    i = 0;
    for select id, stamp from tabelle2 into :id, :stamp do
    begin
    i = i + 1;
    if (f_modulo( i, anzahl) = 1) then
    suspend;
    end
    end^

    SET TERM ; ^
    [/highlight]
    Zuletzt editiert von Markus Kinzler; 11.12.2007, 13:46.

    Comment


    • #3
      Vielen Dank für Deine Hilfe Markus, es klappt!!!!!!

      lg

      Comment


      • #4
        Eine Frage hätte ih noch, wie kann ich diese SP aufrufen mit einem SQL- Befehl von meinem Java- code aus?

        lg

        Comment


        • #5
          [highlight="sql"]
          select * from <UDFName>( <Anzahl>);
          [/highlight]

          Comment


          • #6
            Hallo nochmal,

            jetzt wollte ich noch den Tabellennamen variable machen (also als Parameter übergeben) , dass geht aber nicht so leicht, scheint es:

            Code:
            CREATE PROCEDURE TABELLE2JEDERXTE (TABELLENNAME VARCHAR(30), ANZAHL ..
            ...
            FOR SELECT zeitstempel, wert FROM :TABELLENNAME ...

            Geht das nicht oder mache ich da was falsch??,

            lg und vielen Dank

            Comment


            • #7
              Haben alle Tabellen die gleichen Felder?

              Comment


              • #8
                Originally posted by Markus Kinzler View Post
                Haben alle Tabellen die gleichen Felder?
                ich habe 10 Tabellen und 8 Tabellen haben die gleichen Felder (Spalten-> TIMESTAMP | WERT)

                Ich bin auch draufgekommen, dass 2 SELECT- Anweisungen in einer Prozedur nicht funktionieren, oder?,

                Ich wollte nämlich vor der Abfrage noch die Anzahl bestimmen:
                Code:
                SELECT COUNT(*) FROM GLO WHERE zeitstempel BETWEEN :zeitstempel1 AND :zeitstempel2;
                geht das irgendwie??

                Vielen Dank

                Comment


                • #9
                  Doch innerhalb einen Prozedur kannst du beliebig viele Statements absetzen.
                  Du musst in sagen wohin er das Ergebnis schreiben soll:
                  [highlight="sql"]
                  SELECT COUNT(*) FROM GLO WHERE zeitstempel BETWEEN :zeitstempel1 AND :zeitstempel2 into :cnt;
                  [/highlight]
                  Für dein Problem mit den vielen Tabellen gibt es 2 Lösungen: SQL-Statements manuell in SP zusammensetzten und per EXECUTE STATEMENT
                  ausführen oder besser die Tabellenstruktur anpassen, z.B. eine Tabelle mit weiteren Feld.

                  Comment


                  • #10
                    Originally posted by Markus Kinzler View Post
                    SQL-Statements manuell in SP zusammensetzten und per EXECUTE STATEMENT
                    ausführen
                    Wie würde das funktionieren?
                    Ich lege die Tabellen beim ersten Programmstart an, da möchte ich nicht noch eine Tabelle anlegen müssen,

                    Vielen Dank für die Antworten,

                    lg

                    Comment


                    • #11
                      [highlight="sql"]
                      SET TERM ^ ;

                      CREATE PROCEDURE JEDERXTER (
                      TABELLE VARCHAR(16),
                      ANZAHL INTEGER)
                      RETURNS (
                      ID INTEGER,
                      STAMP TIMESTAMP)
                      AS
                      DECLARE VARIABLE SQL VARCHAR(1024);
                      DECLARE VARIABLE I INTEGER;
                      begin
                      i = 0;
                      SQL = 'select id, stamp from ' || :Tabelle;
                      for EXECUTE STATEMENT SQL into :id, :stamp do
                      begin
                      i = :i + 1;
                      if (f_modulo( :i, :anzahl) = 1) then
                      begin
                      suspend;
                      end
                      end
                      end^

                      SET TERM ; ^
                      [/highlight]

                      Comment


                      • #12
                        Morgen,

                        vielen Dank für Deine Hilfe,
                        Ich wollte jetzt noch das SQL- Statement
                        Code:
                        ' WHERE zeitstempel BETWEEN :zeitstempel1 AND :zeitstempel2 '
                        einbaue, aber ich weiß nicht recht wo, ich bekomme immer eine Fehlermeldung,

                        Könntest Du mir da noch einen Tipp geben?

                        lg und vielen Dank,

                        Comment


                        • #13
                          [highlight="sql"]
                          SQL = 'select id, stamp from ' || :Tabelle || ' WHERE zeitstempel BETWEEN :zeitstempel1 AND :zeitstempel2 ';
                          [/highlight]

                          Comment


                          • #14
                            Vielen Dank,

                            zum kompilieren gehts jetzt aber ich bekomme noch den Fehler
                            "Unbekannte Spalte: zeitstempel1,

                            Weißt Du vielleicht, was da noch falsch sein kann?

                            Code:
                            SET TERM ^ ;
                            CREATE PROCEDURE TABELLE2JEDERXTEVersion5 (TABELLE VARCHAR(25), PixelANZAHL INTEGER, zeitstempel1 TIMESTAMP, zeitstempel2 TIMESTAMP)
                            RETURNS (zeitstempel TIMESTAMP, wert FLOAT)
                            AS
                            DECLARE VARIABLE SQL VARCHAR(1024);
                            DECLARE VARIABLE I INTEGER;
                            DECLARE VARIABLE tupelGesamt INTEGER;
                            DECLARE VARIABLE skipAnzahl INTEGER;
                                  begin
                                       i = 0;
                                       SELECT COUNT(*) FROM GLO WHERE zeitstempel BETWEEN :zeitstempel1 AND :zeitstempel2 INTO :tupelGesamt;
                                       skipAnzahl =  tupelGesamt/PixelAnzahl;
                                       SQL = 'select zeitstempel, wert from ' || :Tabelle || ' WHERE zeitstempel BETWEEN :zeitstempel1 AND :zeitstempel2 ';
                                       FOR EXECUTE STATEMENT SQL INTO :zeitstempel, :wert
                                       do
                                         begin
                                              i = :i + 1;
                                              IF  (mod( :i, :skipAnzahl) = 1) then
                                                  suspend;
                                         end
                                   end
                            SET TERM ;  ^

                            Comment


                            • #15
                              Versuch mal:
                              [highlight="sql"]
                              SQL = 'select zeitstempel, wert from ' || :Tabelle || ' WHERE zeitstempel BETWEEN ' || :zeitstempel1 || ' AND ' || :zeitstempel2;
                              [/highlight]

                              Comment

                              Working...
                              X