oceanbase 企业版 JDBC 查询结果中的 column label 会规范化输出,但是这个规范化规则是什么?

【 使用环境 】测试环境
【 OB or 其他组件 】OB
【 使用版本 】4.2.1
【问题描述】oceanbase 企业版 JDBC 查询结果中的 column label 会规范化输出,但是这个规范化规则是什么?
【复现路径】SELECT CASE WHEN FROM DUAL

比如一个 SQL如下:
select case when '1' ='1' then 't' else 'f' end from dual
SQL中的select 列没有 as 语句,那么从 JDBC 中拿到的这一列的 column label 会规范化输出,某些时候这一列超长,还会后面加 0,我想知道,这个规范化输出的规则是什么,什么时候会后面加列的 index,OB 内部通过什么参数来控制长度?

企业版相关问题,建议去咨询企业工单同学。
1.如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;
2.如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。
OceanBase官网商务咨询

https://www.oceanbase.com/contactus?fromPage=https%3A%2F%2Fwww.oceanbase.com%2Fsoftwarecenter-enterprise&dataSources=softwarecenter-enterprise_footercontact_d2022

  1. 这个 应该跟 OB 企业版无关,或者跟 OB 内核关系不大,而是跟 OB 的 JDBC 驱动有关。换个问法 :slight_smile:
  2. 从 4.2.1 版本开始,OceanBase Connector/J 已经开源,因此不再区分商业版和社区版,用户可以从 OceanBase 软件下载中心的社区版中下载导数工具包。地址: oceanbase/obconnector-j: OceanBase Client for Java is a JDBC 4.2 compatible driver, used to connect applications developed in Java to OceanBase Database Server. 有兴趣可以自己阅读源码看。
  3. 这种列名不规范的场景,代码里可以按列的索引取值也行。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class Example {
    public static void main(String[] args) {
        String url = "jdbc:oceanbase:oracle://IP:端口/库名?连接参数";
        String username = "用户名";
        String password = "密码";
        Connection conn = null;

        try {
            Class.forName("com.oceanbase.jdbc.Driver");
            conn = DriverManager.getConnection(url, username, password);

            // 执行查询
            PreparedStatement ps = conn.prepareStatement("SELECT CASE WHEN '1' = '1' THEN 't' ELSE 'f' END FROM dual");
            ResultSet rs = ps.executeQuery();

            // 获取列名
            ResultSetMetaData metaData = rs.getMetaData();
            String columnLabel = metaData.getColumnLabel(1); // 获取第一列的列名
            System.out.println("Column Label: " + columnLabel);

            // 获取数据
            while (rs.next()) {
                String result = rs.getString(1); // 使用列索引获取数据
                System.out.println("Result: " + result);
            }

            rs.close();
            ps.close();
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

1 个赞

OB Oracle 模式也是用的这个开源的驱动吗?

我另外看了下,OB 会把入参当做列名的一部分。
比如 SQL 是这样的

select ? from dual

入参是 AAA,那么第一列的 label 就会是’AAA’,如果入参是 BBB,那么 label 就会是’BBB’了。

是的。只要是 OB 就能用。

@obpilot 这种情况和 Oracle、mysql、pg 都不一样啊,有配置可以调整吗?
oracle 的话,列名会是:1