【问题标题】:SQL/JDBC : select query on variable tablenamesSQL/JDBC:选择对变量表名的查询
【发布时间】:2010-09-08 13:28:42
【问题描述】:

我正在使用 Oracle DB,我想编写一个 SQL 查询,然后我可以使用 JDBC 调用该查询。我对 SQL 不是很熟悉,所以如果有人可以帮助我,那就太好了!这是问题所在。我有一个表 MY_TABLE ,其中包含另一个表的列表,我想只保留非空表以及它们的名称以特定字符串开头的表。 我写的查询如下:

 select TABLE_NAME 
 from MY_TABLE 
 where TABLE_NAME like '%myString%' 
 and (select count(*) from TABLE_NAME where rownum=1)<>0 
 order by TABLE_NAME;`

问题来自第二个 SELECT,但我不知道如何使用 TABLE_NAME 值。

有人有想法吗?

谢谢。


[从 cmets 添加]

实际上,我需要测试 ALL_CATALOG 表中包含的 V$ 视图。但是,如果我能找到另一个包含所有这些视图并且也包含 NUM_ROWS 列的表,那将是完美的!

【问题讨论】:

  • 您的数据模型有问题。它至少与 JDBC 无关,它只是使用 Java 触发和处理 SQL 查询的“信使”。所以我删除了标签。
  • 做不到;不应该这样做。
  • 因为 JDBC 不允许您绑定表名或列名。
  • 难道不能创建一个可以做到这一点的SQL函数,然后从JDBC调用prepareCall()方法吗?
  • 视图没有行,v$view 甚至没有“真实”的表数据。如果你用实际的方式解释你想要达到的目标,而不是如何实现,你可能会得到更有用的答案

标签: sql oracle select tablename


【解决方案1】:

标准版本的 SQL 不允许您将查询的“结构元素”(例如表名或列名)替换为变量值或占位符。

有几种方法可以解决这个问题。

  1. 为 MY_TABLE 中列出的每个表名生成单独的 SQL 语句,并依次执行每个语句。蛮力,但有效。
  2. 直接查询系统目录。
  3. 调查是否有 JDBC 元数据操作可以让您了解表中的行数,而无需绑定到您正在使用的特定 DBMS 的系统目录。

【讨论】:

  • 1.我第一次做了类似的事情,它有效,但执行大约需要 20 秒。我的目标是减少执行时间。 2.其实MY_TABLE就是ALL_CATALOG表。 3. JDBC 元数据操作只提供列信息,不提供行...
【解决方案2】:

你可以使用 oracle 视图 USER_TABLES 吗?那么查询会容易得多

select TABLE_NAME 
from USER_TABLES 
where TABLE_NAME like '%myString%' 
and Num_ROWS > 0
order by TABLE_NAME;`

【讨论】:

  • 其实我需要测试一下ALL_CATALOG表中包含的V$视图。但是,如果我能找到另一个包含所有这些视图并且也包含 NUM_ROWS 列的表,那将是完美的!
猜你喜欢
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
相关资源
最近更新 更多