我正忙于一段代码来从Oracle数据库获取表的列名。我想出的代码如下所示:
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection(
"jdbc:oracle:thin:@<server>:1521:<sid>", <username>, <password>);
DatabaseMetaData meta = conn.getMetaData();
ResultSet columns = meta.getColumns(null, null, "EMPLOYEES", null);
int i = 1;
while (columns.next())
{
System.out.printf("%d: %s (%d)\n", i++, columns.getString("COLUMN_NAME"),
columns.getInt("ORDINAL_POSITION"));
}
当我运行此代码时,令我惊讶的是,返回了太多列。仔细研究发现,ResultSet包含所有列的重复集,即每个列都返回了两次。这是我得到的输出:
1: ID (1)
2: NAME (2)
3: CITY (3)
4: ID (1)
5: NAME (2)
6: CITY (3)
当我使用Oracle SQL
Developer查看该表时,它显示该表只有三列(ID,NAME,CITY)。我已经针对数据库中的几个不同表尝试了此代码,其中一些工作很好,而另一些表现出这种奇怪的行为。
Oracle JDBC驱动程序中可能有错误吗?还是我在这里做错了什么?
更新:
感谢Kenster,我现在有了另一种检索列名的方法。您可以从ResultSet中获取它们,如下所示:
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@<server>:1521:<sid>", <username>, <password>);
Statement st = conn.createStatement();
ResultSet rset = st.executeQuery("SELECT * FROM \"EMPLOYEES\"");
ResultSetMetaData md = rset.getMetaData();
for (int i=1; i<=md.getColumnCount(); i++)
{
System.out.println(md.getColumnLabel(i));
}
这似乎工作得很好,没有重复返回!对于那些想知道的人:根据此博客,您应该使用getColumnLabel()而不是getColumnName()。
在oracle中,Connection.getMetaData()
返回 整个
数据库的元数据,而不仅仅是您碰巧要连接到的架构。因此,当您提供null
的前两个参数时meta.getColumns()
,您并不仅要过滤模式的结果。
您需要将Oracle模式的名称提供给的前两个参数之一meta.getColumns()
,可能是第二个,例如
meta.getColumns(null, "myuser", "EMPLOYEES", null);
这样做有点烦人,但这是Oracle员工选择实现其JDBC驱动程序的方式。
问题内容: 考虑到此代码,我是否可以 绝对确定 该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 如果您调用 如果JVM首先崩溃 如果JVM在或块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM进程;例如,在UNIX上 如果主机系统死机;例如,电源故障,硬件错误,操作系统崩溃等 如果该块将由守护程序线程执行并
我试图将三列作为一个字符串,但由于某些原因,我只得到NULL。 以下是代码: places表包含name、city和country三列,它不是空的,但在某些列中可以包含NULL。 结果是: 我试着从这篇帖子中得到答案,如果任何字段包含NULL,MySQL CONCAT将返回NULL,但它对我不起作用。
问题内容: 我有一个查询,返回以下行: StateId,OrderId,OrderTime,PermitId 我只需要返回全盘完全重复的行,因此每条记录必须与另一条记录完全相同,这样它才可以重复。我想退回两个记录。这些记录与一堆没有重复的记录混在一起… 任何的想法? 问题答案: 首先,确定重复项。其次,重新加入以提取这些行。 非聚集(或非窗口/排名)自连接形成部分交叉连接,并为任何一组键给出重复的
如您所见,它将参数和的和保存在变量中,然后将包含它们的和的eax寄存器保存在变量中,就像函数返回值一样。 这样做是因为函数是用返回值定义的吗?
问题内容: 这个问题已经在这里有了答案 : java InetAddress.getLocalHost(); 返回127.0.0.1…如何获得REAL IP? (11个答案) 7年前关闭。 我的问题类似于这个问题。我想获取机器的真实IP(不是127.0.0.1),但是很奇怪,Ubuntu中的以下代码返回了127.0.1.1。 以下是我的完整代码,最初在此处发布在SO中 上面的代码返回127.0.1