我有这样定义的文件:
A R RCONVTXT
A TEXT 100A COLHDG('Text')
A TEXT2B 100G COLHDG('Text')
A CCSID(1200 *NOCONVERT)
我正在处理存储在" TEXT"中的波兰语中的字符。字段。
如果我在我的rpgle程序中使用此代码:
exec sql
UPDATE CONVTXT set TEXT2B =
CAST(CAST(TEXT as char(100) CCSID 65535)
AS CHAR(100) CCSID 870);
第一个字段中的所有文字" TEXT"在unicode的其他字段中完美转换并更新。
但是如果我要转换的文本在文本字段(100c)中,我该如何使用SQL转换它?
答案 0 :(得分:3)
RPG将自动在CCSID之间进行转换。这就是所需要的:
**free
dcl-s ucs2str Ucs2(100) Inz('this is a test');
dcl-s charstr Varchar(100) Inz('');
charstr = ucs2str;
以下是有关此主题的更多信息。 TL / DR以下代码有效,只是旁注,我们的系统设置为CCSID 65535.这不一定是一个好的选择,它只是事物的方式。
exec sql
create table jmmlib/mytable
(charfld Char(100) ccsid 37,
ucs2fld NChar(100));
exec sql
insert into jmmlib/mytable
values('Constant Test', 'Constant Test'),
(:ucs2str, :ucs2str),
(:charstr, :ucs2str);
exec sql
declare c1 cursor for
select cast(ucs2fld as char(100) ccsid 37), charfld from jmmlib/mytable;
exec sql
open c1;
exec sql
fetch c1 into :ucs2str, :charstr; ((1))
exec sql
fetch c1 into :charstr, :ucs2str; ((2))
exec sql
fetch c1 into :ucs2str, :charstr; ((3))
exec sql
close c1;
所以这里的事情有点混乱,以帮助保持分离。我不一定会以这种方式编码。表列按以下顺序排列(UCS2,CHAR)。获取列按以下顺序排列(CHAR,UCS2)。
首先看看插入物。我可以在每个字段中插入常量,并正确转换字符集。我可以将UCS2字符串插入UCS2字段或CHAR字段。但是,我只能将CHAR字段插入CHAR字段。在65535和UCS2之间进行转换似乎存在一些问题。我认为这对我来说是一个问题,因为我们的盒子的QCCSID系统值设置为65535.即使我们的作业的默认CCSID是37,也是如此。如果QCCSID被设置为其他,我认为这不是问题。方式。
接下来看一下游标C1
的声明。我已将UCS2FLD转换为CCSID 37.这是我可以使FETCH((2))工作的唯一方法。这又是转换问题。 CCSID 37可能会被放入65535字段,因为它是EBCDIC CCSID,因此该字段仍然是EBCDIC,即使没有发生转换,并且RPG可以正常(或SQL,因为它是SQL错误消息)。但是如果不首先转换它就不能将UCS2FLD放入EBCDIC字段,并且它不能从UCS2转换为CCSID 65535.再一次,如果我们不使用CCSID 65535,我认为这不会是一个问题。
答案 1 :(得分:0)
您是否在询问如何在嵌入式SQL中使用RPG定义的变量?
如果是这样,答案很简单。您只需要在SQL语句中的RPG变量前面放置一个前导':'。
Dcl-S Text Char(100) Inz('blah');
Exec Sql
Update ConvTxt Set Text2B =
Cast(Cast(:Text As Char(100) CCSID 65535)
As Char(100) CCSID 870);
此外,您可以使用以下内容将字符串设置为特定的CCSID,这可能是您问题的更好解决方案。
Dcl-S Text Char(100) CCSID(870) Inz('blah');
Exec Sql
Update ConvTxt Set Text2B = :Text;