oracle中已经知道一个具体值,如何根据该值查询出含有该值的表名和列名?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中已经知道一个具体值,如何根据该值查询出含有该值的表名和列名?相关的知识,希望对你有一定的参考价值。

如图:已经知道D3这个值,用什么语句可以根据D3查询出含有D3值的表名:“IQC_PPAP_PROJECTS”和列名:“VEHICLEMODEL”

如何查询oracle一个数据库中包含有某个特定值的所有表及字段名
-我这里说的字段名跟列 是同一个意思

select column_name,
table_name,data_type ,data_length,data_precision,data_scale from user_tab_columns where column_name='字段名';
--根据字段名查出相关的表名出来。记录下来
--然后对查出来的表进行查询,找到含这内容字段的表
select * from 表名 where 字段名='xiaoming'追问

当前的问题是只知道一个具体值,此值既非表名也非列名,无法使用select * from 表名 where 字段名='xiaoming'来实现!

参考技术A 好久没用oracles数据库了。我记得里面有个查询所有表名的,系统表
all_tables 你看看这个表中有没有字段的。然后在查询条件
如果这个表中没有表的字段,那就把表名都粘出来。然后where加条件。把有数值的粘出来追问

COLUMN_NAME可以代表任意列名,请问有什么可以代表任意行值?

参考技术B 你这个需求很不好做,就算是做了,也不一定有实际应用意义。因为性能不敢保证。当然还是可以做到的。思路如下。
首先,查询系统自带试图all_tables或者user_tables,如果可以指定用户名更好。
然后,循环每一个表的每一个字符串字段,看是不是有包含D3的值 ,如果有记下来表名字段名,就这样一直循环。
因为数据库表有可能很多,而且说不定哪个字段有了D3,还有是不是考虑clob字段,等等。所以最终不一定是你想要的结果。当然如果你可以指定某几个表或者表名,字段名有某些规律的话,会好很多。
谨慎操作追问

请问在试图all_tables查询每一张表是否包含D3的值 ,用SQL语句怎么表示?

参考技术C all_tables 你看看这个表中有没有字段的。然后在查询条件追问

COLUMN_NAME可以代表任意列名,请问有什么可以代表任意行值?

如何在 Oracle 中调试 PL/SQL 集合的值?

【中文标题】如何在 Oracle 中调试 PL/SQL 集合的值?【英文标题】:How can I debug the value of a PL/SQL collection in Oracle? 【发布时间】:2010-10-21 19:17:36 【问题描述】:

我正在调试一个...返回某些值的过程。该程序似乎使用DBMS_SQL.DESCRIBE_COLUMNS2,直到现在我都不知道。

DBMS_SQL.DESCRIBE_COLUMNS2 过程的输出变量之一是一个集合,我想检查该值是否返回到该集合中 - 我如何观察/观察/检查该值?

我使用 Allround Automations 的 PL/SQL Developer,但也有 Oracle 的 SQL Developer 作为我可以使用的工具。


尝试像这样遍历集合;

For Val In 1..M_Rec_Tab.Count Loop
 Dbms_Output.Put_Line( M_Rec_Tab(Val) );
end loop;

但这会引发PLS-00306: wrong number or types of arguments in call to 'PUT_LINE'

M_Rec_Tab 被声明为Dbms_Sql.Desc_Tab2 类型。

Dbms_Sql.Desc_Tab2 声明为desc_tab2 is table of desc_rec2 index by binary_integer

我使用的是 Oracle 10g R2 (10.2.0.1.0)

【问题讨论】:

遍历内容,使用DBMS_OUTPUT.PUT_LINE打印出值? 抱歉,我没有使用过 Oracle 集合,否则我会提供更多帮助。 【参考方案1】:

你就快到了……再走一步。 desc_tab2的定义是:

TYPE desc_rec2 IS RECORD (
   col_type            binary_integer := 0,
   col_max_len         binary_integer := 0,
   col_name            varchar2(32767) := '',
   col_name_len        binary_integer := 0,
   col_schema_name     varchar2(32)   := '',
   col_schema_name_len binary_integer := 0,
   col_precision       binary_integer := 0,
   col_scale           binary_integer := 0,
   col_charsetid       binary_integer := 0,
   col_charsetform     binary_integer := 0,
   col_null_ok         boolean        := TRUE);

所以你可以遍历集合并输出记录中每个字段的值:

For Val In 1..M_Rec_Tab.Count Loop   
 Dbms_Output.Put_Line( '----- Record #'||Val||' -----' );   
 Dbms_Output.Put_Line( 'Column Type: '||M_Rec_Tab(Val).col_type );   
 Dbms_Output.Put_Line( 'Max Length: '||M_Rec_Tab(Val).col_max_len );
...
 Dbms_Output.Put_Line( 'Charset Form: '||M_Rec_Tab(Val).col_charsetform );
 Dbms_Output.Put_Line( 'Nulls Allowed: '|| case when M_Rec_Tab(Val).col_null_ok then 'Y' else 'N' end );
end loop; 

【讨论】:

这就是我需要的语法!谢谢 table_type_var(index).col_name

以上是关于oracle中已经知道一个具体值,如何根据该值查询出含有该值的表名和列名?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CloudKit 查询条件 segues?

如何在 Oracle 查询中查找传递数组中某个值的索引

从表 2 中选择一个值,该值依赖于表 1 中的另一个值 (Oracle SQL)

如何在 Oracle 中调试 PL/SQL 集合的值?

Oracle数据库中,知道一个值,如何查询它所在的表,是哪个字段?

PL/SQL:如何根据列值插入