PDA

View Full Version : SQL-Aufruf eines Webservices in SQL-Funktion einbauen



KM
08-02-17, 08:11
Hallo,

ich habe zur Ermittlung der Ähnlichkeit zweier Texte einen REST-Webservice erstellt. Diesen kann ich per SQL auch problemlos aufrufen. Das sieht z.B. folgendermaßen aus:


SELECT *
FROM XMLTABLE('$doc/levenshteinData'
PASSING
XMLPARSE(DOCUMENT SYSTOOLS.HTTPGETCLOB
('http://ban:8080/webservices/levenshtein/text1/' concat systools.urlencode('Muhammad', 'UTF-8') concat '/text2/' concat systools.urlencode('Mohammed', 'UTF-8'),''))
AS "doc"
COLUMNS
Text1 VARCHAR(1000) PATH 'text1',
Text2 VARCHAR(1000) PATH 'text2',
Similarity DECIMAL(5, 2) PATH 'similarity'
) AS WebServiceResult;


Jetzt würde ich das gerne in eine SQL-UDF einbauen, der ich die beiden Texte als Parameter übergebe und dann den Ergebniswert zurückgebe. Das habe ich so versucht:


CREATE OR REPLACE FUNCTION DTOBJ/GETSIMILARITY (
P_TEXT1 VARCHAR(1000) ,
P_TEXT2 VARCHAR(1000))

RETURNS DECIMAL(5, 2)
LANGUAGE SQL
SPECIFIC DTOBJ/GETSIMILARITY
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT

BEGIN
-- Variablen
DECLARE SIMILAR DECIMAL(5, 2) DEFAULT 0;

SELECT Similarity into SIMILAR
FROM XMLTABLE('$doc/levenshteinData'
PASSING
XMLPARSE(DOCUMENT SYSTOOLS.HTTPGETCLOB
('http://ban:8080/webservices/levenshtein/text1/' concat systools.urlencode(P_TEXT1, 'UTF-8') concat '/text2/' concat systools.urlencode(P_TEXT2, 'UTF-8'),''))
AS "doc"
COLUMNS
Text1 VARCHAR(1000) PATH 'text1',
Text2 VARCHAR(1000) PATH 'text2',
Similarity DECIMAL(5, 2) PATH 'similarity'
) AS WebServiceResult;

RETURN SIMILAR;
END;

Die Erstellung der UDF meckert, dass das "doc" ungültig sei. Ich weiß jetzt aber nicht wie ich das sonst angeben könnte.

Geht das überhaupt? Kann ich so einen Aufruf in eine UDF packen? Wenn ja, wie?

Gruß,
KM

KM
08-02-17, 16:39
Ich hab jetzt selbst die Lösung gefunden...

Der Fehler trat nur auf, wenn ich die UDF per Script mit RUNSQLSTM erstellen wollte. Mit dem System i Navigator hat es schließlich funktioniert.

Gruß,
KM

Pikachu
09-02-17, 09:32
Vielleicht ein CCSID-Problem mit dem $-Zeichen?

KM
09-02-17, 09:54
Nein, am $-Zeichen liegt das nicht. Scheint eher ein Problem mit dem RUNSQLSTM zu sein.

Wie gesagt mit dem System i Navigator hat es ja funktioniert.

Gruß,
KM

B.Hauser
09-02-17, 10:03
Kann es sein, dass Du im Skript über die Position 80 hinausgeschrieben hast, jedoch die Option MARGINS im Befehl RUNSQLSTM nicht verändert hast?

Wenn ich dein Beispiel anschaue, kommst du sicher über 80 Zeichen in der Breite, d.h. die halbe Zeile wurde einfach abgeschnitten und dann ist as "Doc" natürlich nicht zulässig.

Birgitta

andreaspr@aon.at
09-02-17, 10:34
Nein, am $-Zeichen liegt das nicht. Scheint eher ein Problem mit dem RUNSQLSTM zu sein.

Wie gesagt mit dem System i Navigator hat es ja funktioniert.

Der Navigator verwendet eine andere Umgebung (CCSID, Datumsformat, usw.). Da kann es durchaus sein dass es nicht am RUNSQLSTM liegt sondern was anderen.
Wäre nicht das erste mal dass im Navigator was geht was im 5250 nicht geht oder umgekehrt.

lg Andreas

B.Hauser
09-02-17, 10:39
Das $ Zeichen is Teil der Syntax, da hat er keine andere Wahl (außer auf die Benennung zu verzichten)

Birgitta

KM
09-02-17, 10:39
@Birgitta:
Stimmt, es lag tatsächlich an der Breite. Ich wusste nicht, dass der RUNSQLSTM standardmäßig auf 80 Stellen eingestellt ist. Ich hab den Wert jetzt mal vergrößert. Jetzt funktioniert's.

Vielen Dank,
KM