使用CAST使用emb-sql更改rpgle上的文本字段CCSID

时间:2018-03-16 09:05:28

标签: sql db2 db2-400 rpgle

我有这样定义的文件:

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转换它?

2 个答案:

答案 0 :(得分:3)

RPG将自动在CCSID之间进行转换。这就是所需要的:

**free
dcl-s ucs2str     Ucs2(100) Inz('this is a test');
dcl-s charstr     Varchar(100) Inz('');

charstr = ucs2str;

这是ucs2str的内存转储: enter image description here

以下是分配后charstr的内存转储: enter image description here

以下是有关此主题的更多信息。 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;