代码之家  ›  专栏  ›  技术社区  ›  Kirill

所有字符串都是“????“从对象类型的Oracle检索表时

  •  0
  • Kirill  · 技术社区  · 7 年前

    当我试图从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();
    }
    

    我收到正确的数字,但所有字符串都是“?“?”:

    some_number=1 some_string=????

    some_number=2 some_string=????

    有什么问题吗?

    (我使用ojdbc6.jar)

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jean de Lavarene    7 年前

    如果类路径中不包含orai18n.jar,并且数据库字符集不在此列表中,则会发生这种情况:ascii、utf8或isolatin1。所有字符都替换为“替换字符”,即“?”。您可以从otn下载orai18n.jar(在google中搜索“oracle jdbc download”)。

        2
  •  0
  •   Bryan    7 年前

    在我的公司中,我们在某些Oracle数据库模式中有PII数据列,这些列被修改并替换为自定义字符串。好像是'???序列作为表中的数据编校。您可以与数据库管理员联系,看看是否存在这种情况。