iSeries db2存储过程调用

时间:2017-04-13 13:42:34

标签: character-encoding db2 odbc rpgle rpg

我有一个db2存储过程,如下所示。此proc调用CL来调用RPG程序。

CREATE PROCEDURE bsm4obj/TXCL4055            
(                                            
INOUT POCNO CHAR (10),                       
INOUT POCRN DEC ( 2 , 0 ),                   
INOUT PSPNO CHAR (10),                       
INOUT PMTAD CHAR (1),                        
INOUT PYREX CHAR (1),                        
INOUT PMTYR CHAR (1),                        
INOUT PKMLK CHAR (10),                       
INOUT HATVR CHAR (1)                         
)                                            
LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL
NAME bsm4obj/txCL4055 PARAMETER STYLE GENERAL

我从服务器调用此proc。 (ODBC语言ID土耳其语);

OdbcCommand cmd = new OdbcCommand("{CALL BSM4OBJ.TXCL4055(?,?,?,?,?,?,?,?)}", as400con);
cmd.CommandType = CommandType.Text;

当执行RPG程序时(步骤如下),变量'ŞŞ'不会被编译器识别为像'@@'那样。

  

TSDEPRIFEQ'ŞŞ'

     

//读取类似TSDEPR IFEQ'@@'

程序在As400上的QPADEV会话中完美执行,但是在SQL调用上的行为不是这样的。

我用RPG中的临时替换土耳其静态字符。 但我想找到确切的解决方案。 如果你建议我会很高兴

1 个答案:

答案 0 :(得分:0)

默认情况下,RPG并不总是正确处理字符文字。它在编译时CCSID中保存文字的十六进制值,但它解释作业CCSID中的十六进制值。

从7.2开始,您可以编写H spec关键字CCSID(* EXACT),这将导致RPG记住字符文字的真实CCSID。

另一种解决方法是使用%UCS2对文字进行编码。

if TSDEPR = %ucs2('ŞŞ');