Oracle数据库 “ORA00942: 表或视图不存在” 问题解决方案

2023年 8月 16日 62.0k 0

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

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论