首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle益智:从不存在的表中选择

Oracle益智:从不存在的表中选择
EN

Stack Overflow用户
提问于 2020-09-25 14:31:02
回答 2查看 167关注 0票数 1

我的数据库中有一个名为"libisatz"的表,没有表,也没有名称为"libiSatz"的视图(用大写S代替s),而且在我的模式中找不到有名称"libiSatz"的任何类型的对象。但是,令人惊讶的是,从"libiSatz"中进行选择会得到与我编写"libisatz"相同的结果。如果我将这个名字中的任何其他字母从小写改为大写(例如,我写"Libisatz" ),那么我会得到一个错误。这怎么可能?

增编

我检查了乔恩·海勒的想法,结果如下:

  1. -- select * from DBA_OBJECTS where OBJECT_NAME like 'libi_atz';select * from DBA_OBJECTS where lower(OBJECT_NAME) = 'libisatz';都返回一行(是"libisatz"表)

  1. select * from DBA_OBJECTS where OBJECT_NAME = 'libisatz';返回一行,select * from DBA_OBJECTS where OBJECT_NAME = 'libiSatz';不返回行。

ORA-00942: table or view does not exist的结果是

  1. select * from DBA_SQL_TRANSLATIONS;select * from DBMS_ADVANCED_REWRITE;

  1. select * from DBA_REWRITE_EQUIVALENCES;导致no rows selected

  1. select DUMP(OBJECT_NAME) from DBA_OBJECTS where lower(OBJECT_NAME) = 'libisatz';返回Typ=1 Len=8: 108,105,98,105,115,97,116,122

因此,这个难题似乎还没有解决。

增编2.

  1. 当我尝试创建一个名为"libiSatz"的视图时

ORA-00955: name is already used by an existing object

尽管有上述结果,但

  1. 在我把"libiSatz"改名为"oraclepuzzle"之后,

select count(*) from "libisatz";"select count(*) from "oraclepuzzle";工作,但select count(*) from "libiSatz";不工作。

使用"oraclepuzzle". select * from dba_objects where object_name in ( 'oraclepuzzle', 'libisatz', 'libiSatz');返回一行

EN

回答 2

Stack Overflow用户

发布于 2020-09-26 04:25:50

您是否有SQL翻译、重写等效项或UTF8字符?

构建SQL转换框架是为了允许为其他数据库类型设计的应用程序能够无缝地查询。但是,这个特性也可以用来悄悄地更改查询,而不是翻译语法。例如,here是查询不存在的表以解决表大小限制的一个示例。检查视图DBA_SQL_TRANSLATIONS

重写等价物可以由包DBMS_ADVANCED_REWRITE创建,并且可以用于静默地更改错误查询的结果或一些罕见的性能问题。(在我的简单测试中,我无法让这个查询对无效的查询起作用,但我敢打赌有一种方法可以使它工作。)检查视图DBA_REWRITE_EQUIVALENCES

UTF8字符可能被静默地替换为类似的ASCII字符。这可能取决于数据库和客户端字符集设置。下面的例子显然不是ASCII "S",但是您可能有一个更微妙的问题。检查值的来源,手动重新键入它们,并使用DUMP函数计算字符的二进制值。

代码语言:javascript
复制
SQL> create table "libisatz"(a number);

Table created.

SQL> -- An uppercase "S" does not work
SQL> select * from "libiSatz";
select * from "libiSatz"
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> -- But a "LATIN SMALL LETTER S WITH CARON" works.
SQL> select * from "libišatz";

no rows selected

最后,您是否100%确定数据库中不存在该对象?上面的例子是可能的,但非常罕见。三次检查DBA_OBJECTS.OBJECT_NAME的神秘物体。

票数 1
EN

Stack Overflow用户

发布于 2020-09-25 16:40:33

我的耳聋Oracle对象名称不区分大小写。

因此,当您发出teh命令时:

CREATE TABLE the_table ..

CREATE TABLE The_Table ..

CREATE TABLE THE_TABLE ..

所有情况下的底层对象名称都是THE_TABLE,但是您可以使用大小写的任意组合来访问它:

SELECT * FROM THE_TABLE

SELECT * FROM tHe_TaBlE

SELECT * FROM the_table

一切都会起作用。

当用双引号包装的名称创建表时,名称就会区分大小写.

所以,如果你发布:

CREATE TABLE "libiSatz" ..

然后,所有SQL语句中的表名必须与双引号中的确切名称匹配,即

SELECT * FROM "libiSatz"是好的(更正以下评论)

SELECT * FROM libisatz不好

SELECT * FROM LibiSatz不好

USER_OBJECTSUSER_TABLES中搜索此名称时,必须匹配创建名称:

SELECT * FROM USER_OBJECTS WHERE OBJECT_NAME = 'libiSatz';

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64066126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档