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 中选择未找到现有列的主要内容,如果未能解决你的问题,请参考以下文章

从 Oracle 转换为 SQL Server

从 SQL Server 转换 Oracle 中的更新 SQL

上新 | 《Oracle数据库管理从入门到精通》《Oracle PL/SQL从入门到精通 》

创建 SSIS 包 - 将数据从 Oracle 复制到 SQL Server

从Oracle到SQL Server和从SQL Server到Oracle的迁移指南

从 c# 执行写为 .sql 文件(例如:spool.sql)的 oracle spool 命令,就像使用 OracleCommand 执行任何 oracle 查询一样