[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2010
    Beiträge
    4

    DB2/400 V5, UDF

    Hallo Zusammen,

    ich bin im Thema DB2 recht frisch und habe jetzt ein Problem, was sich mir jetzt nicht ganz erschliesst.

    Problem: Ich habe eine relativ lange und komplexe SQL Abfrage, welche ich gerne als Function auf der DB2 anlegen würde. (View muss ich ausschliessen, da ich parameter in dem SQL Statement verwenden muss).

    Laut DB2/400 Reference sollte das über

    Code:
    CREATE FUNCTION DEPTEMPLOYEES (DEPTNO CHAR(3))
      RETURNS TABLE (EMPNO CHAR(6),
                     LASTNAME VARCHAR(15),
                     FIRSTNAME VARCHAR(12))
      LANGUAGE SQL
      READS SQL DATA
      NO EXTERNAL ACTION
      DETERMINISTIC
      DISALLOW PARALLEL
      RETURN
          SELECT EMPNO,LASTNAME,FIRSTNME
            FROM EMPLOYEE
            WHERE EMPLOYEE.WORKDEPT =DEPTEMPLOYEES.DEPTNO
    funktionieren. Zu Testzwecken habe ich das selbe mit einer einfach Abfrage versucht, jedoch bekomme ich nur eins

    Code:
    [SQL0491] Clause not correct for CREATE FUNCTION or CREATE PROCEDURE.
    Mein jetziger Versuch
    Code:
    CREATE FUNCTION ACTEST (userNr INTEGER)
      RETURNS TABLE (USERNAME CHAR(40))
      LANGUAGE SQL
      READS SQL DATA
      NO EXTERNAL ACTION
      DETERMINISTIC
      RETURN
        SELECT USERNAME FROM TEST.USERS p WHERE p.USERNR = ACTEST.userNr
    Sind Functions evtl. gar nicht möglich? Müsste ich eine Procedure verwenden?

    Vielen Dank für die Aufmerksamkeit!

    Grüße

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... normalerweise müsste man an dem Fehler ersehen - welche Klausel - es da meint. Und das Release ist wichtig: V5R1 kannte noch keine Table Functions z.B.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #3
    Registriert seit
    Apr 2010
    Beiträge
    4
    Danke erstmal für die Antwort BenderD!

    Release auf der Maschine ist 4, also
    V5R4

    Ich muss dazu sagen, dass ich die Funktion über JDBC versuche abzusetzen, was ja eigentlich keine Rolle spielen sollte oder?

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... für die Erstellung der Function nicht, für die Error Information schon. Es macht aus meiner Sicht schon Sinn, die Function am "grünen" SQL Interpreter, oder noch besser aus einer Textquelle per RUNSQLSTM zu erstellen.

    D*B

    Zitat Zitat von asrijaal Beitrag anzeigen
    Danke erstmal für die Antwort BenderD!

    Release auf der Maschine ist 4, also
    V5R4

    Ich muss dazu sagen, dass ich die Funktion über JDBC versuche abzusetzen, was ja eigentlich keine Rolle spielen sollte oder?
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Wie Bender schon sagte, es muss eine genauere Fehlermeldung zurückgegeben werden, die das eigentliche Problem beschreibt.

    Ansonsten:
    *) Verwende in SQL Functions oder Procedures NIE CHAR sonder NUR VARCHAR. Du hast damit - zumindest bis V5R4 - NUR Probleme dadurch.
    *) Ich bin mir nicht sicher ob die qualifizierte Angabe des Eingangparameters (DEPTEMPLOYEES.DEPTNO) überhaupt erlaubt ist?!
    *) Du solltest auch beim Erstellen von SQL Functions oder Procedures IMMER die Bibliothek mit angeben.
    Im schlechtesten Fall erstellt er das Objekt in eine Lib die nicht existiert oder viele andere Probleme treten auf.
    *) In einer SQL-Function kannst du dieses Beispiel schon realisieren, jedoch wäre eine Procedure hübscher.
    Die Function würdest du dann wie folgt aufrufen:
    Select * from table (myfunction('Procedure?'))

  6. #6
    Registriert seit
    Apr 2010
    Beiträge
    4
    Hallo zusammen,

    erstmal Danke für die Antworten. Die Ausgabe auf der iSeries hat mich weiter gebracht, ein

    Code:
    DISALLOW PARALLEL
    fehlte zum erstellen der Funktion. Jetzt ist diese erstellt, jedoch - das klingt etwas doof - weiss ich nicht, wie ich sie ausführen soll

    Erstellt wurde die Funktion in der Lib ATEST

    Ein
    Code:
    SELECT * FROM ATEST.ACTEST(3)
    wirft nur einen SQL Fehler raus.

    Auf die Syntax von Andreas bekomme ich nur

    Code:
    [SQL0104] Token  was not valid. Valid tokens: AS IN OUT .
    Ausführen tue ich

    Code:
    SELECT * FROM table(ATEST.ACTEST(3))
    Vielen Dank für die Geduld und antworten.

  7. #7
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.012
    Hallo,

    versuch's doch mal mit

    SELECT * FROM table(ATEST.ACTEST(3)) as Hugo

    Gruß,
    KM

  8. #8
    Registriert seit
    Apr 2010
    Beiträge
    4
    Vielen Dank! So gehts

Similar Threads

  1. Antworten: 11
    Letzter Beitrag: 18-07-16, 09:49
  2. HTML Daten in DB2/400
    By leber in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 05-01-07, 09:15
  3. UDF nicht verwendbar
    By Peder in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 06-12-06, 08:15
  4. udf ohne ergebniss
    By ILEMax in forum NEWSboard Programmierung
    Antworten: 25
    Letzter Beitrag: 18-09-06, 13:39
  5. SQL UDF Prob mit leeren Feldern
    By HACHIMAN in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 22-05-06, 09:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •