Announcement

Collapse
No announcement yet.

Kann man so etwas wie eine "FUNCTION" in FB erstellen?

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

  • Kann man so etwas wie eine "FUNCTION" in FB erstellen?

    Hallo.

    Ich sitze im Moment an einem Projekt, wo ein kleiner Teil abgespalten werden soll, welcher unter Firebird (aktuelle 2.1 Version) laufen muss.
    Das ganze läuft ursprünglich unter Sybase (iAny 10).

    Jetzt stehe ich vor dem Problem, dass ich die Funktionen vom Sybase nicht nachbilden kann. Diese Funktionen sollen von der Datenbank selbst und vom Programm aus aufrufbar sein.

    Ich habe mir eine SP geschrieben, kann sie aber nicht innerhalb eines Selects aufrufen. Kann man das grundsätzlich irgendwie hin bekommen? Also dass man innerhalb des Selects die SP aufruft und sie halt für die eine (aufrufende) Zeile den Wert zurück gibt?

    Mal das ganze an einem Beispiel.
    Folgende SP soll die Langtexte auslesen und in eine extra Blob-Tabelle schreiben (falls noch nicht vorhanden da sie sich oft wiederholen) und die ID zurück geben zum passenden Text.

    Die SP sieht so aus:
    Code:
    CREATE PROCEDURE GETLONGTEXT(
      LONGTEXT BLOB SUB_TYPE 1 CHARACTER SET ISO8859_1 DEFAULT NULL)
    RETURNS(
      TEXTID BIGINT)
    AS
    DECLARE VARIABLE HashValue VARCHAR(32) CHARACTER SET ISO8859_1;
    DECLARE VARIABLE CountExists integer;
    BEGIN
      HashValue = LONGMD5(LONGTEXT);
      select count(LongTextID) from LongTexts where TextHash=:HashValue and TextContent=:LONGTEXT into :CountExists;
      IF (:CountExists = 0) THEN
        BEGIN
          INSERT INTO LongTexts (TextHash, TextContent) VALUES (:HashValue, :LongText);
        END
      select LongTextID from LongTexts where TextHash=:HashValue and TextContent=:LONGTEXT into :TEXTID;
      SUSPEND;
    END;
    LONGMD5 ist dabei eine UDF, die soweit auch funktioniert (in verschiedenen Selects schon ausprobiert).

    Jetzt habe ich versucht das zu Testen.
    Code:
    select DescriptionText, GETLONGTEXT(DescriptionText) from DocumentStore where StoreID=xxx
    Erwarten würde ich nun einen Text und die passende ID, welche im Hintergrund Transparant eingetragen wurde. Ich bekomme jedoch die Fehlermeldung die Funktion GETLONGTEXT wäre nicht bekannt.

    Wie kann ich das also so hinbasteln, dass das funktioniert?

  • #2
    Warum sollte es nicht gehen? Entweder als selectable SP

    [highlight="sql"]
    select <Feldliste> From <SP>(<Parameter>;
    [/highlight]
    oder halt als execute

    Comment


    • #3
      Ein select from allein geht ja. Aber nicht innerhalb eines selects auf eine normale Tabelle. Und ein JOIN geht ja auch nicht, weil es zu dem Zeitpunkt noch keine gemeinsamen Schlüssel gibt.

      Comment


      • #4
        Ein Funktion in PLSQL gibt es erst ab FB 3.0 und die ist noch in der Entwicklung :-(
        Aber es gibt Hoffnung und eine Lösung.
        Versuche mal folgendes

        SELECT Feld1
        ,(Select * FROM GETLONGTEXT(DescriptionText)) AS LONGTEXT
        FROM tabellenname

        Wenn das Select genau eine Zeile zurückgibt geht das.

        Gruß Hartmuth

        Comment


        • #5
          Auf die Variante mit dem Sub-Select war ich auch gerade gekommen. Finde ich zwar etwas "unelegant", aber funktioniert erst einmal.

          Vielen Dank

          Comment

          Working...
          X