参数文件上的AS400 SQL脚本返回

时间:2018-10-25 12:11:59

标签: java jdbc ibm-midrange jt400

我正在使用Java / JT400驱动程序将应用程序集成到AS400。从参数文件提取数据时遇到问题-检索到的数据似乎已编码。

SELECT SUBSTR(F00001,1,20) FROM QS36F."FX.PARA" WHERE K00001 LIKE '16FFC%%%%%' FETCH FIRST 5 ROWS ONLY

输出

00001: C6C9D9C540C3D6D4D4C5D9C3C9C1D34040404040,  - 1
00001: C6C9D9C5406040C3D6D4D4C5D9C3C9C1D3406040,  - 2

如何将其转换为可读格式?有可以用来解码的功能吗?

在与AS400的终端连接上,通过相同的SQL查询可以正确显示信息。

在此之前,我没有使用AS400的经验,可以真正使用一些帮助。此问题仅与参数文件有关。数据库表工作正常。

4 个答案:

答案 0 :(得分:2)

您看到的是EBCDIC输出而不是ASCII。这是由于未如其他答案中所述在数据库中指定CCSID。理想的解决方案是将CCSID分配给数据库中的字段。如果您没有这样做的能力并且不能说服负责任的人这样做,那么以下解决方案也应该有效:

SELECT CAST(SUBSTR(F00001,1,20) AS CHAR(20) CCSID(37))
FROM QS36F."FX.PARA"
WHERE K00001 LIKE '16FFC%%%%%'
FETCH FIRST 5 ROWS ONLY

用您需要的任何一个替换CCSID。您可以在这里找到CCSID定义:https://www-01.ibm.com/software/globalization/ccsid/ccsid_registered.html

答案 1 :(得分:1)

由于该文件位于QS36F中,所以我猜该文件是平面文件,而不是外部定义的...因此,如果通过SQL访问文件中的数据,则必须手动对其进行解释。

您可以在将字段细分为字符串后尝试将其转换为字符格式。

(我没有S / 36文件,所以我真的无法尝试)

答案 2 :(得分:0)

它是EBCDIC(AS / 400字符集)中文本的十六进制字节。

static String fromEbcdic(String hex) {
    int m = hex.length();
    if (m % 2 != 0) {
        throw new IllegalArgumentException("Must be even length");
    }
    int n = m/2;
    byte[] bytes = new byte[n];
    for (int i = 0; i < n; ++i) {
        int b = Integer.parseInt(hex.substring(i*2, i*2 + 2), 16);
        bytes[i] = (byte) b;
    }
    return new String(bytes, Charset.forName("Cp500"));
}

通过“ C6C9D9C540C3D6D4D4C5D9C3C9C1D34040404040”。

使用 Cp500 作为字符集转换文件:

Path path = Paths.get("...");
List<String> lines = Files.readAllLines(path, Charset.forName("Cp500"));

对于行尾(在AS / 400上的NEL字符U + 0085),可以使用正则表达式:

content = content.replaceAll("\\R", "\r\n");

正则表达式\R将完全匹配一个换行符,无论是否是\r, \n, \r\n, \u0085

答案 3 :(得分:0)

非常感谢您提供的所有答案,它们都是正确的。

这是AS400中的平面参数文件,我无法控制更改系统中的任何内容。因此,它必须在SQL查询的运行时或一旦接收到。

我完全不知道代码页是什么,因为我以前没有使用过AS400和其中的文件。因此,您的所有回答都帮助解决了这个问题并给我带来了启发。 :)

因此,最好的答案是最后一个。我已按如下方式更改了SQL,并得到了预期的结果。

public class Dice {
    private int currentRoll;

    //Constructor
    public Dice() {
        roll();
    }

    // methods...

00001:消防,-1 00001:火灾-商业-,-2

再次感谢。

迪兰克

相关问题