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
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