PDA

View Full Version : DB2/400 V5, UDF



asrijaal
20-04-10, 13:30
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



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


[SQL0491] Clause not correct for CREATE FUNCTION or CREATE PROCEDURE. Mein jetziger Versuch

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

BenderD
20-04-10, 13:42
... 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

asrijaal
20-04-10, 13:49
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?

BenderD
20-04-10, 14:19
... 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


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?

andreaspr@aon.at
20-04-10, 14:22
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?'))

asrijaal
27-04-10, 11:10
Hallo zusammen,

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



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

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

Auf die Syntax von Andreas bekomme ich nur


[SQL0104] Token <end-of-statement> was not valid. Valid tokens: AS IN OUT <identifier>.Ausführen tue ich


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

Vielen Dank für die Geduld und antworten.
</identifier></end-of-statement>

KM
27-04-10, 11:32
Hallo,

versuch's doch mal mit

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

Gruß,
KM

asrijaal
27-04-10, 12:07
Vielen Dank! So gehts :)