PDA

View Full Version : SQL 400 UDF



SReusch
12-01-06, 12:07
I5 9406/520 RE: V5R3M0 L00

Hallo Leute,

habe mich als Anfänger in SQL an den User Defined Functions versucht.

Ich fand dazu ein Beispiel in der IBM Lektüre, dass ich nach zu vollziehen versuchte.
Hier der Code zum erstellen der Funktion:

CREATE FUNCTION SAMPLE.ABTMA(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 SAMPLE.EMPLOYEE
WHERE WORKDEPT =ABTMA.DEPTNO

Die Funktion wurde problemlos in der Bibl. SAMPLE erstellt und steht dort als
Objekt Art Bibliothek Attribut Text
ABTMA *SRVPGM SAMPLE CLE SQL FUNCTION ABTM

Danach wollte ich die Funktion mit folgendem SELECT testen:

SELECT EMPNO, LASTNAME, FIRSTNAME
FROM TABLE(ABTMA ('A00')) AS D

Nach diesem Aufruf kommt folgende Fehlermeldung :

SQL-Status: 42704
Vendorencode: -204
Nachricht: [SQL0204] ABTMA der Art *N in *LIBL nicht gefunden. Ursache . . . . : ABTMA der Art *N in *LIBL wurde nicht gefunden. Handelt es sich um eine Anweisung ALTER TABLE und ist die Art *N, wurde eine Integritätsbedingung oder Partitionierung nicht gefunden. Ist dies keine Anweisung ALTER TABLE und ist die Art *N, wurde eine Funktion, eine Prozedur oder ein Auslöser nicht gefunden. Wurde eine Funktion nicht gefunden, ist ABTMA das Serviceprogramm, das die Funktion enthält. Die Funktion wird nur gefunden, wenn der externe Name und der Verwendungsname exakt übereinstimmen. Im Jobprotokoll nach einer Nachricht suchen, die weitere Einzelheiten über den gesuchten Funktionsnamen und den nicht übereinstimmenden Namen enthält. Fehlerbeseitigung: Den Namen ändern und die Anforderung wiederholen. Ist das Objekt eine Knotengruppe, sicherstellen, dass DB2 Multisystem auf dem System installiert ist, und mit dem CL-Befehl CRTNODGRP eine Knotengruppe erstellen. Wurde eine externe Funktion nicht gefunden, das Groß-/Kleinscheibung des EXTERNAL NAME der Anweisung CREATE FUNCTION exakt mit der Groß-/Kleinschreibung des vom Serviceprogramm exportierten Namens übereinstimmen.

Verarbeitung wurde beendet, da die hervorgehobene Anweisung nicht erfolgreich abgeschlossen werden konnte.


Hat jemand eine Erklärung dafür, warum die UDF nicht gefunden wurde?

Besten Dank im voraus für Eure Hilfe

Gruß

Stefan

Rincewind
12-01-06, 16:07
Bibliotheksliste ist korrekt gesetzt ?

Datei EMPLOYEE ist in der Bibliotheksliste ?

Gruß
Rince

/edit/
Eventuell muss man das SAMPLE auch im Binddirectory eintragen ?

B.Hauser
12-01-06, 16:26
Hallo,

Dein Problem liegt darin, dass der Parameter als Ausruck übergeben wurde. Ausdrücke werden von SQL als Datentyp VARCHAR interpretiert. VARCHAR und CHAR werden von SQL als unterschiedliche Datentypen gehandelt. Da SQL-Funktionen überladen werden können, wird nach einer Funktion gesucht, die einen VARCHAR-Parameter hat. Diese wird jedoch nicht gefunden.

Langer Rede kurzer Sinn. Du müsstest die Funktion aufrufen können, wenn Du den Ausdruck in einen CHAR-Datentyp umwandelst:



SELECT EMPNO, LASTNAME, FIRSTNAME
FROM TABLE(ABTMA (cast('A00' as Char(3)))) AS D;


Birgitta

SReusch
13-01-06, 07:13
Hallo Brigitta,

das war es.

Besten Dank für deine Hilfe

MfG

Stefan