PDA

View Full Version : SQL Fehler 57017 beim Verabreiten des Cursors im SQLRPGLE



oulbrich
06-04-17, 14:11
Hallo zusammen,

das folgenden SQL Statment gibt die Wechselkurse von der Deutschen Bank zurück.
Führe ich das SQL aus werden die Werte korrekt ausgeben. Wenn ich das SQL nun eingebettet in RPG verwenden wird bei auslesen des Cursors der Fehler 57017 Character conversion is not defined zurückgegeben. Hat jemand ein Idee wir der Fehler abgestellt werden kann?

SQL Script

SELECT *
FROM
XMLTABLE('$doc/Envelope/Cube/Cube/Cube' PASSING XMLPARSE(DOCUMENT SYSTOOLS.HTTPGETCLOB
('https://www.db-markets.com/dbm/portal/FxSettlementRates/31-03-2017','')
)
AS "doc"
COLUMNS
Subject VarChar(30) CCSID 1208 Path '../../../Subject',
Sender VarChar(30) CCSID 1208 Path '../../../Sender/Name',
valueDate char(8) Path '@valuedate',
Currency Char(3) Path '@currency',
ask Dec(10, 4) Path '@ask',
bid Dec(10, 4) Path '@bid'
)
AS WebServiceResult



Das RPG sieht so aus

// -----------------------------------------------------------------------------------------
// SQL Definitionen
// -----------------------------------------------------------------------------------------
dcl-proc SqlDef;

sql_txt=' -
SELECT * -
FROM -
XMLTABLE(''$doc/Envelope/Cube/Cube/Cube'' PASSING XMLPARSE(DOCUMENT SYSTOOLS.HTTPGETCLOB -
(''https://www.db-markets.com/dbm/portal/FxSettlementRates/31-03-2017'','''') -
) -
AS "doc" -
COLUMNS -
Subject VarChar(30) CCSID 1208 Path ''../../../Subject'', -
Sender VarChar(30) CCSID 1208 Path ''../../../Sender/Name'', -
valueDate char(8) Path ''@valuedate'', -
Currency Char(3) Path ''@currency'', -
ask Dec(10, 4) Path ''@ask'', -
bid Dec(10, 4) Path ''@bid'' -
) -
AS WebServiceResult -
';
exec sql prepare sql_stmt from :sql_txt; // SQL Text in Sql Statment
exec sql declare c1 cursor for sql_Stmt; // Cursor C1 mit Sql Statement verknüpfen
exec sql open c1; // Ausführem SQL Statement

end-Proc;
// -----------------------------------------------------------------------------------------
// Lesen Cursor C1
// -----------------------------------------------------------------------------------------
dcl-proc ReadCursorC1;

dow sqlstt <>'02000';
exec Sql fetch c1 into:DDS1;
if sqlstt ='02000';
return;
endIf ;
// Do something
enddo;

end-proc;
// -----------------------------------------------------------------------------------------
// Sql Definitionen
// -----------------------------------------------------------------------------------------
dcl-proc CloseCursor;

exec sql close C1;

end-Proc;

Fuerchau
06-04-17, 14:25
Die Fehlermeldung besagt, dass zur Laufzeit eine CCSID nicht passt.
Prüfe die CCSID des Jobs zur Laufzeit.
Häufig ist die Ursache eine CCSID *HEX (65535).

Wie ist die Zielstruktur definiert?
Verwende hier ggf. UCS2-Felder.

oulbrich
06-04-17, 15:05
Die Zielstruktur sieht so aus

dcl-ds DDS1;
ySubject varchar(30);
ySender varchar(30);
yValueDate char(8);
yCurrency char(3);
yAsk zoned(10:4);
yBid zoned(10:4);
end-Ds;


die CCSID lautet 65535

Fuerchau
06-04-17, 16:18
Wie gesagt. Wie soll denn zur Laufzeit eine decodierung von 1208 in 65535 funktionieren?
Mache einen CHGJOB CCSID(1141/273) oder definiere die Variablen als nvarchar (die Syntax weiß ich jetzt nicht) für Unicode/UCS2.
Per %char() kannst du die dann später immer noch umwandeln, wobei du hier Umlautprobleme bei 65535-JobCCSID bekommst.