Oracle SQL:从 all_tab_columns 中选择未找到现有列
Posted
技术标签:
【中文标题】Oracle SQL:从 all_tab_columns 中选择未找到现有列【英文标题】:Oracle SQL: selecting from all_tab_columns does not find existing column 【发布时间】:2013-06-26 05:40:45 【问题描述】:如果我运行以下查询:
select count(*) from all_tab_columns
where column_name = 'foo'
and table_name = 'VIEW0';
我得到 0 的结果。我期待 1。
但如果我运行以下查询,我会返回许多(预期的)行:
select foo from VIEW0;
为什么?我假设我犯了一些愚蠢的语法错误,或者我的理解错了。
【问题讨论】:
您在 column_name 中搜索的值不应该是大写吗? 【参考方案1】:至少在 11g 中,您似乎无法从 PL/SQL 访问数据字典表。在 PL/SQL 内的 all_tab_columns 上运行任何选择始终不会返回任何结果。尝试访问 dba_tab_columns 将无法编译,因为编译器认为该表(或视图)不存在。
我很想看看如何从 PL/SQL 访问数据字典。
【讨论】:
【参考方案2】:ALL_TAB_COLUMNS describes the columns of the tables, views, and clusters accessible to the current user. 检查运行此查询的用户是否有权访问所需的表。
【讨论】:
【参考方案3】:可能的原因是您有区分大小写的设置。
尝试添加UPPER
函数如下。
select count(*) from all_tab_columns
where column_name = upper('foo')
and table_name = 'VIEW0';
【讨论】:
Oracle 总是以大写形式存储列名和表名;所以'foo'需要上层 谢谢!就是这样!如果允许,我会在 4 分钟内投票。 @DmitryBychenko 我已经改变了答案。谢谢! column_name 和 table_name 上的大写是不需要的,实际上其他两个大写是不需要的,因为一个已经全部大写,很容易将另一个改成大写,而不必做任何工作系统来改变情况。 等等,接受答案和投票有区别吗?以上是关于Oracle SQL:从 all_tab_columns 中选择未找到现有列的主要内容,如果未能解决你的问题,请参考以下文章