Anmelden

View Full Version : Probleme mit SQL und xmlserialize



Lesca
15-04-15, 14:35
Hallo zusammen

Ich sollte ein SQL erstellen, in welchem sich der Output aus dem Inhalt von verschiedenen Datensätzen zusammensetzt.

Anbei ein "einfaches" Beispiel:

SELECT
substr( xmlserialize( xmlagg( xmltext( concat( ' / ', char(gpaid) ) ) )
as CLOB(1024) ), 4)
from ripgpa

--> Ergibt den Output = SYSDAT / LIBDTA / JRN

Mein Problem ist nun folgendes:
wenn ich dieses SQL im iNavigator laufen lasse, funktioniert es. Aber leider nicht auf dem IBM-Green-Screen (STRSQL via IBM i-Hauptmenu). Die Fehlermeldung lautet "Argument 1 der Funktion XMLTEXT ungültig."

Das SQL muss ich schlussendlich aus einem RPG aufrufen. Erfahrungsgemäss funktioniert das nicht, wenn das SQL auf dem Green-Screen nicht läuft. So auch aktuell, das RPG gibt einen Fehler zur Laufzeit aus: "Unerwarteter SQL-Code '-901' bei 'Prepare1 - Prepare SQLExtractV1' - 'CPF4204"

Hat jemand eine Idee?

Tritt auf in V7r1

Vielen Dank!

B.Hauser
15-04-15, 14:48
Dass das Statement nicht aus RPG läuft, wenn es im STRSQL nicht läuft ist nicht gesagt.
STRSQL ist "stabilized" also wird nicht mehr weiterentwickelt. Die letzten Erweiterungen sind soweit ich mich erinnere in Release V4R5 (oder die Größenordnung) hinzugekommen, während die letzten Neuerungen in den IBM i Navigator integriert wurden.
Die XML-Erweiterung in SQL wurde erst mit Release 7.1 eingeführt.

Birgitta

Lesca
15-04-15, 14:58
Danke für die schnelle Antwort.

D.h., dieses SQL kann im STRSQL gar nicht funktionieren?

Trotzdem, in RPG eingebunden funktioniert es leider nicht.

B.Hauser
16-04-15, 07:25
Wie sieht das SQL-Statement in Deinem RPG-Program aus und welchen SQLCODE (oder SQLSTATE) bekommst Du zurück?

Sofern Du den SQLCODE -901 (System-Fehler) zurückbekommen solltest, solltest Du prüfen lassen, ob Ihr alle PTFs für SQL und Datenbank installiert habt. Falls nicht nachinstallieren, wenn doch musst Du Dich an die IBM wenden, dann liegt ein Bug vor, der behoben werden muss.

Was willst Du überhaupt erreichen? Einfach nur irgendwelche Texte über mehrere Zeilen verknüpfen? In diesem Fall wäre vielleicht eine Rekursion einfacher.
Falls Ihr auf dem aktuellen Release Stand in 7.1 seid kannst Du mal folgendes probieren:
Datei: MyTable mit 2 Spalten MyId (laufender Zähler) und MyText (zu verknüpfende Texte).

Das folgende Beispiel setzt mit MyId 4 auf und verküpft die Texte (MyText) von MyId=4 bis einschließlich MyId=7:

Select Max(Substr(Sys_Connect_By_Path(MyText, '/'), 2))
From myTable
Start with MyId = 4
connect by NoCycle Prior MyId = MyId - 1
and MyId <= 7;

Hier ist auch noch zwei interesante Artikel von Kent Milligang zu dem Thema:
TechTip: Combining Multiple Row Values into a Single Row with SQL in DB2 for i (http://www.mcpressonline.com/sql/techtip-combining-multiple-row-values-into-a-single-row-with-sql-in-db2-for-i.html)
TechTip: More on Combining Multiple Row Values into a Single Row with SQL in DB2 for i (http://www.mcpressonline.com/sql/techtip-more-on-combining-multiple-row-values-into-a-single-row-with-sql-in-db2-for-i.html)

Birgitta