【 使用环境 】测试环境
【 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 内部通过什么参数来控制长度?
辞霜
2025 年1 月 21 日 16:05
#3
企业版相关问题,建议去咨询企业工单同学。
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
这个 应该跟 OB 企业版无关,或者跟 OB 内核关系不大,而是跟 OB 的 JDBC 驱动有关。换个问法
从 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. 有兴趣可以自己阅读源码看。
这种列名不规范的场景,代码里可以按列的索引取值也行。
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’了。
@obpilot 这种情况和 Oracle、mysql、pg 都不一样啊,有配置可以调整吗?
oracle 的话,列名会是:1