Oracle数据库 “ORA-00942: 表或视图不存在” 问题解决
最近在完成数据库课设项目时需要连接oracle数据库,本人采用的是Navicat Premium,连接过程均正常,但实现一个简单的接口并测试时出现报错问题,提示“ORA-00942: 表或视图不存在”:
查询相关资料发现,可能是以下原因:
数据库中表本身不存在或者名称出现错误,检查后发现不是此类原因。
Oracle中对大小写敏感,在写sql脚本时如果是用create table 表名
的形式,Oracle数据库会自动将表名转换为大写。
如:
create table routes(...)
则最终表名实际上为 ROUTES
。
所以如果想要最终的表名为小写的 routes
,实际上建表时应该像下面这样写:
create table "routes"(...)
如果加上了”“,那么我们采用一般的SQL语句查询则会产生“ORA-00942: 表或视图不存在 ”,因此SQL脚本中需要将表名也加上”“。
select * from "routes";
如果想要将数据库表名更改为不带双引号的版本,即默认生成全大写的版本,可以用如下的查询语句(反之同理):
ALTER TABLE "routes"
RENAME TO routes;
更新完后表名默认转换为大写:
对于表中的属性可能也会有同样的问题,如果想要统一格式将所有属性的名称修改为全部大写的版本,可以使用如下SQL语句:
DECLARE
stmt VARCHAR2(1000);
BEGIN
FOR col IN (SELECT column_name
FROM user_tab_columns
WHERE table_name = 'ROUTES')
LOOP
stmt := 'ALTER TABLE ROUTES RENAME COLUMN "' || col.column_name || '" TO ' || REPLACE(col.column_name, '"', '');
EXECUTE IMMEDIATE stmt;
END LOOP;
END;
/
这段代码会在 Oracle 数据库中创建一个匿名 PL/SQL 块。它会遍历 "ROUTES" 表中的所有列,并执行动态 SQL 语句来去除列名中的双引号。
修改后该表内的所有属性名称都会以大写形式呈现:
此时再次测试接口,不会出现报错问题。
总结:
- 在 Oracle 中,如果在创建表时使用了双引号将表名括起来,那么表名将区分大小写。只能使用双引号包围的方式来引用该表。例如:
SELECT * FROM "routes";
- 默认情况下,如果在创建表时不使用双引号,Oracle 将表名视为不区分大小写。在这种情况下,可以使用大小写混合或全小写的方式来引用表名,例如:
SELECT * FROM routes;
或SELECT * FROM ROUTES;
都是有效的。 - 总之,从逻辑上讲,"routes" 和 "routes" 都表示同一个表,只是在引用时可能受到 Oracle 数据库的命名规则和大小写处理方式的影响。如果不需要特殊处理,通常建议使用不使用双引号的表名,以避免不必要的复杂性。