【需求】
程序中需要建表,需要动态知道DB系统所允许的表名最大长度。
如果按11g允许的30位给12c,19c设置,那么后两者实际允许的128位就被武断限制了。
【思路】
使用create table tname(df char(1));这样的语句建表,不断加长tname的长度,当建表出现异常时,回退一位便是系统允许的最大表名长度。
【程序】
Test类:
package com.hy.lab.tablelength; import java.sql.Connection; import java.sql.Statement; public class Test { public static void main(String[] args){ System.out.println(probeMaxLen()); } public static int probeMaxLen(){ int retval=30; String tname="t1234"; try(Connection conn=DbUtil.getConn(); Statement stmt=conn.createStatement()){ while(true){ tname+="0"; String createSql=String.format("create table %s(fd char(1))",tname); stmt.execute(createSql); String deleteSql=String.format("drop table %s purge",tname); stmt.execute(deleteSql); } }catch(Exception ex){ retval=tname.length()-1; } return retval; } }
DbUtil类:
package com.hy.lab.tablelength; import java.sql.Connection; import java.sql.DriverManager; public class DbUtil { //-- 以下为连接Oracle数据库的四大参数 private static final String DRIVER = "oracle.jdbc.OracleDriver"; private static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521/orcl"; private static final String USER = "luna"; private static final String PSWD = "1234"; public static Connection getConn() throws Exception{ Class.forName(DRIVER); Connection conn = DriverManager.getConnection(URL, USER, PSWD); return conn; } }
【输出】
30
【扩展思路】
可以用一张表把DB和对应的允许长度存起来,第二次便可以从表中取了。
END