Oracle数据库 “ORA-00942: 表或视图不存在” 问题解决

Oracle数据库 “ORA-00942: 表或视图不存在” 问题解决

最近在完成数据库课设项目时需要连接oracle数据库,本人采用的是Navicat Premium,连接过程均正常,但实现一个简单的接口并测试时出现报错问题,提示“ORA-00942: 表或视图不存在”:

在这里插入图片描述

查询相关资料发现,可能是以下原因:

  1. 数据库中表本身不存在或者名称出现错误,检查后发现不是此类原因。

  2. 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 数据库的命名规则和大小写处理方式的影响。如果不需要特殊处理,通常建议使用不使用双引号的表名,以避免不必要的复杂性。

猜你喜欢

转载自blog.csdn.net/m0_61443432/article/details/132267642