View Full Version : problem mit eigener sql function
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 ??
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'
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. .
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.
super danke jetzt hauts hin
die qualifizierung geht aber mit punkt
lib.datei
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
super erklärung
ich wollte nämlich schon fragen obs möglich ist die parameter per value zu übergeben.
hat sich somit erledigt
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 !!!
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