Java 从对象类型的Oracle检索表时,所有字符串均为“?”

Java 从对象类型的Oracle检索表时,所有字符串均为“?”,java,oracle,struct,Java,Oracle,Struct,当我试图从Oracle过程中检索对象类型时,我收到了正确的数字,但是该过程传递给我的所有字符串都是???。 我的例子是: import oracle.sql.ARRAY; import oracle.sql.ArrayDescriptor; import oracle.sql.STRUCT; import oracle.sql.StructDescriptor; import java.sql.Array; import java.sql.CallableStatement; import j

当我试图从Oracle过程中检索对象类型时,我收到了正确的数字,但是该过程传递给我的所有字符串都是???。 我的例子是:

import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;

import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSetMetaData;
import java.sql.Struct;
import java.sql.Types;

public class InitMethod {

    public static void init() throws Exception {
        Class.forName("oracle.jdbc.OracleDriver");
        Connection connection =
                DriverManager.getConnection("jdbc:oracle:thin:@10.0.0.20:1521:dw", "user", "password");

        final String typeName = "T_DEMO_OBJECT";
        final String typeTableName = "T_DEMO_OBJECTS";

        final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName.toUpperCase(), connection);
        final ResultSetMetaData metaData = structDescriptor.getMetaData();

        CallableStatement cs = connection.prepareCall("{call p_generate_demo_objects(?, ?)}");
        cs.setInt(1, 7);

        cs.registerOutParameter(2, Types.ARRAY, typeTableName);
        cs.execute();

        Object[] data = (Object[]) ((Array) cs.getObject(2)).getArray();
        for (Object tmp : data) {
            Struct row = (Struct) tmp;

            int idx = 1;
            for (Object attribute : row
                    .getAttributes()) {
                System.out.println(metaData.getColumnName(idx) + " = " + attribute);
                ++idx;
            }
            System.out.println("---");
        }
        cs.close();
}
我收到正确的数字,但所有字符串都是??:

一些数字=1一些字符串=

一些数字=2一些字符串=

可能有什么问题


在我的公司中,我使用ojdbc6.jar,我们在某些Oracle数据库模式中有PII数据列,这些列被编辑并替换为自定义字符串。“??”序列似乎是表中的数据编校。您可以与数据库管理员联系,查看是否存在这种情况。

如果在类路径中不包含orai18n.jar,并且数据库字符集不在此列表中,则会发生这种情况:ASCII、UTF8或ISOLATIN1。所有字符都替换为替换字符,即“?”。您可以从谷歌的OTN search for oracle jdbc下载下载orai18n.jar。

Ok。我试试这个。谢谢。这仍然是未知的情况。我在我们的生产系统中尝试了这个精确的代码,它工作正常。在此之前,我在我的小测试项目中执行了代码。我现在不明白是怎么回事。