PDA

View Full Version : problem mit eigener sql function



Stefan_Sk
26-05-06, 14:24
hallo forum

also ich mache die function mit dem operrationsnavigator

erste seite: (allgemein)
name: llerzbez
rück: character
35

Liest SQL-Daten

seite ( parameter)
prm_phznr character 7

seite (SQL-Statment)



BEGIN
DECLARE BEZ CHAR ( 35 ) ;

SELECT
CASE
WHEN ARERZNR = 3 THEN AGIBEZ
WHEN ARERZNR <> 3 THEN ENAME1
END AS BEZ1 INTO BEZ
FROM LLART , LLERZ
LEFT OUTER JOIN LLARTGRE ON ARARTGRE = AGEARTGRE
AND AGEERZNR = ARERZNR
LEFT OUTER JOIN LLARTGRI ON AGEARTGRI = AGIARTGRI
WHERE ARERZNR = EERZNR AND ARPHZNR = PRM_PHZNR ;
RETURN BEZ ;
END

nach dem erstellen auf ok.
wird ganz normal umgewandelt und ein srvpgm erstellt.

wenn ich jetzt aber die funktion im interaktiven sql verwenden möchte geht nichts.


select LLERZBEZ('1811344') from llart where arphznr = '1811344'

// folgender fehler
select LLERZBEZ('1811344') from llart where arphznr = '1811344'
LLERZBEZ der Art *N in *LIBL nicht gefunden.


wo ist mein fehler ??

Fuerchau
26-05-06, 14:29
Wie ist denn der Eingabeparameter definiert ?
Für einen korrekten Funktionsaufruf muss das Format der Eingabedaten 100%ig dem Format der Definition entsprechen.

Man kann nämlich mehrere Funktionen mit gleichem Namen aber unterschiedlichen Parametern definieren.

Für den korrekten Aufruf ist ggf. ein Cast erforderlich:
Ist. z.B. der Eingabeparameter CHAR(10):
select LLERZBEZ(cast('1811344' as char(10)) from llart where arphznr = '1811344'

Stefan_Sk
26-05-06, 15:03
danke für die schnelle antwort.

also der aufruf geht jetzt aber gleich darauf bekomme ich diesen fehler


LLART in Bibliothek LLDATA auf. Der Fehlercode ist 1. Fehlercodes und ihre
Bedeutung:
1 -- Das externe Programm oder Serviceprogramm hat SQLSTATE 42704
zurückgegeben. Die vom Programm zurückgegebene Textnachricht ist:
LLARTQPGMRFILE n QPGMR nicht gefunden. .

Fuerchau
26-05-06, 15:34
Ich denke du musst die Dateien mit der Lib qualifizieren !
Wenn nichts explizit gesagt wird, wird eine Tabelle in der Lib mit dem Usernamen gesucht. In deinem Fall anscheinend QPGMR.

Desweiteren musst du den Fehlerfall des Select's (keine Daten) abfangen und NULL zurückgeben.

Stefan_Sk
26-05-06, 15:52
super danke jetzt hauts hin

die qualifizierung geht aber mit punkt

lib.datei

B.Hauser
26-05-06, 15:55
Hallo Stefan,

werden alphanumerische Ausdrücke in einem Funktions-Aufruf angegeben, werden diese Ausdrücke als alphanumerische Datentypen mit variabler Länge (VARCHAR) interpretiert.

Da Funktionen überladen werden können, d.h. der gleiche Funktions-Name kann mit unterschiedlicher Parameter-Defintion mehrfach verwendet werden können und für SQL CHAR und VARCHAR unterschiedliche Datentypen sind, wird die Funktion nicht gefunden. SQL sucht nach einer Funktion, deren Parameter VARCHAR ist. Um dieses Problem zu umgehen, musst Du den alphanumerischen Ausdruck in einen Parameter mit fixer Länge umwandeln.
Dies geschieht entweder durch die Verwendung der skalaren Funktion CHAR oder durch CAST.
(CAST sollte aufgrund des SQL-Standards bevorzugt werden.)



select LLERZBEZ(Cast('1811344' as Char(35)))
from llart
where arphznr = '1811344'

Birgitta

Stefan_Sk
26-05-06, 16:14
super erklärung
ich wollte nämlich schon fragen obs möglich ist die parameter per value zu übergeben.

hat sich somit erledigt

Fuerchau
26-05-06, 16:34
Durch SQL werden die Parameter immer per Value übergeben. Mit den Variablen kann man beliebig arbeiten, da SQL die Inhalte niemals zurückgibt.

Aber Vorsicht:
SQL-Funktionen sind ganz normale Programme/Prozeduren, die auch per CALL aufgerufen werden können.
In diesem Fall muss der Prototyp die VALUE-Klausel enthalten damit der RPG-Compiler Kopierroutinen einbaut.
Sonst würden die Parameter per Reference übergeben (was es eigentlich immer ist) und Änderungen der Inhalte nach oben wirken !!!

Fuerchau
26-05-06, 16:37
Die Namenskonvention ist default SQL. Dadurch ergibt sich als Trenner der Punkt.
Mittels "set option ..." können diverse Ergänzungen gemacht werden die ggf. nicht unwichtig sind.
Insbesonders eben
naming=*sql/*sys
dftrdbcol=libxxx <= Bei *sql eben USER, bei *sys=*LIBL
commit=*none/*chg/... <= Bei Updates ganz wichtig