如何使用 jdbc 从 Oracle 结果集中获取架构名称?
我想在 Oracle 数据库上运行查询,对于结果集中的每一列,我想知道该列来自的架构。我尝试了以下操作:
ResultSetMetaData rsMetadata = rs.getMetaData();
String schemaName = rsMetadata.getSchemaName(1)
但是,这会返回一个空字符串。有什么办法可以获取架构名称吗?
编辑回应 OMG Ponies:
我们正在开发的工具从数据库中获取数据并分析数据,以找到给定问题的信息最丰富的子集。然后,我们创建一个查询,该查询仅返回对给定问题提供信息的行。例如,如果我们有一个客户数据库,并且想知道哪些客户最有可能停止其服务,我们的工具可以创建一个查询,返回 5% 的客户记录,然后可以通过高性能分析算法运行该查询。好处是我们只对数据的子集进行分析,这当然会节省时间。事实证明,高性能分析算法现在效果更好,因为第一步本质上是从数据中过滤掉噪音。
因此,为了响应 OMG Ponies,用户指定数据库连接信息和查询作为我们工具的输入。因为他们可以指定他们喜欢的任何查询,所以用户可以连接到模式 foo,然后运行以下查询:
SELECT* FROM bar.customer;
如果由于某种原因眼睛颜色和性别是人们停止服务的预测因素,则生成的查询我们的系统生成的结果可能如下所示:
SELECT * FROM bar.customer WHERE bar.customer.eye_color='blue'
AND bar.customer.gender='M'
最好知道结果集中每一列的架构,这样我们就可以确保我们的查询能够正确运行。我们可以假设该架构与数据库连接中使用的架构相同,并且 99% 的情况下都应该没问题。我只是担心 1% 的时间用户可能会做一些意想不到的事情,比如针对另一个模式运行查询。
I want to run a query on an Oracle database and for each column in the result set, I want to know the schema that the column came from. I tried the following:
ResultSetMetaData rsMetadata = rs.getMetaData();
String schemaName = rsMetadata.getSchemaName(1)
However, this returns an empty string. Is there any work around to get the schema name?
Edit in response to OMG Ponies:
The tool we are developing takes data from a database and analyzes the data to find the most informative subset for a given question. We then create a query which returns only the rows that are informative for the given question. For instance if we had a customer database and wanted to know which customers are most likely to discontinue their service, our tool can create a query which returns 5% of the customer records which can then be run through high powered analytics algorithms. The benefit is that we run our analysis on only a subset of the data which of course will save time. It turns out as well that the high powered analytics algorithms work better now because the first step was essentially filtering the noise out of our data.
So in response to OMG Ponies, the user specifies the database connection information and query as inputs to our tool. Because they can specify any query they like, it would be possible for a user to connect to connect to schema foo, and then run the following query:
SELECT* FROM bar.customer;
If for some reason eye color and gender were predictors of people discontinuing their service, the resulting query that our system generates might look like this:
SELECT * FROM bar.customer WHERE bar.customer.eye_color='blue'
AND bar.customer.gender='M'
It would be nice to know the schema for each column in the results set so we can make sure our query will run correctly. We could assume the schema is the same as the schema used in the database connection and that should be fine 99% of the time. I'm just concerned for that 1% of the time a user might do something unexpected like run a query against another schema.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
根据旧的 Oracle 代码示例:
这对我来说意味着
ResultSetMetaData
也不会为 Oracle 提供这些方法,至少在使用 Oracle 驱动程序时是这样。 (我尝试使用 OCI 驱动程序看看这是否有影响,但显然没有)。有一个 WebLogic 8 文档 建议这是可以做到的,但类型 4 驱动程序已在以后的版本中被弃用。因此,您仍然有可能找到支持 Oracle 的
getSchemaName()
的第三方驱动程序,但这似乎不太可能。According to an old Oracle code sample:
That implies to me that
ResultSetMetaData
will not have those methods for an Oracle either, at least when using an Oracle driver. (I tried with the OCI driver to see if that made a difference, but apparently not).There's a WebLogic 8 document that suggests it could be done, but that type 4 driver has been deprecated in later releases. So it's possible you may still be able to find a third-party driver that supports
getSchemaName()
against Oracle, but it seems unlikely.您可以通过一些自定义函数和查询来获取此信息。基本上,使用 DBMS_SQL 查找查询使用的列,然后将其与 v$sql_plan 中引用的表进行匹配。但这种方法可能存在很多问题;哪一列来自哪个表以及解释计划中的不同对象等之间可能存在歧义。
You may be able to get this information with some custom functions and queries. Basically, find the columns used by a query with DBMS_SQL and then match that to the tables referenced in v$sql_plan. There are potentially a large number of issues with this approach though; possible ambiguities between which column came from which table, and different objects in the explain plan, etc.