2017-04-13 62 views
0

我有一个像下面这样的db2存储过程。这个过程调用一个CL来调用一个RPG程序。iSeries db2存储过程调用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程序(在步骤如下面)变量“SS”不是由编译器识别像它不过是“@@”。

TSDEPR IFEQ 'SS'

//读取像TSDEPR IFEQ '@@'

程序在QPADEV会议完全执行对AS400但SQL调用没有这样的表现。

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

+0

什么是您的系统CCSID?什么CCSID是ODBC作业'QZDASOINIT'运行的?交互式'QPADEV'作业使用什么CCSID?该程序编译的是什么CCSID? – jmarkmurphy

+0

我们可能正在查看这里没有正确传递的变量。 考虑使用varchar&integer inout来创建你的程序。然后让程序把变量放到正确的大小上来调用你的CL程序等等。您可能会惊喜地发现通过odbc等方式调用它们非常容易。 Varchar和整数可以作为常量从调用过程中传递。 – danny117

回答

0

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

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

另一个解决方法是用%UCS2编码文字。

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