You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ORA-00922错误解决:公交车CH-20维修历史查询视图问题

问题分析与解决方案

错误原因

你的视图创建语句存在以下问题,直接或间接导致ORA-00922错误:

  • 字段名拼写错误:Staff表中存储联系方式的字段是ContactNumber,但查询中误写为PhoneNumber,触发无效标识符类语法错误。
  • CASE逻辑完全失效:MaintenanceID是表的主键且被定义为NOT NULL,因此WHEN MaintenanceID IS NOT NULL永远为真,无法区分计划内/非计划内维修。
  • 权限缺失可能:若当前数据库用户无CREATE VIEW权限,也会触发ORA-00922错误。

修正后的视图代码

情况1:Maintenance表新增计划标识字段(推荐)

先给Maintenance表添加专门的计划标识字段:

ALTER TABLE Maintenance ADD IsScheduled NUMBER(1) NOT NULL DEFAULT 0;

再创建正确的视图:

CREATE VIEW ViewE AS 
SELECT 
    m.DateOfMaintenance AS Maintenance_Date,
    TRIM(m.Description) AS Maintenance_Location, -- 去除CHAR类型的尾部空格
    CASE 
        WHEN m.IsScheduled = 1 THEN 'Scheduled'
        ELSE 'Not Scheduled'
    END AS Maintenance_Scheduled,
    s.FirstName || ' ' || s.LastName AS Supervisor_Name,
    s.ContactNumber AS Supervisor_Phone
FROM 
    Maintenance m
INNER JOIN 
    Staff s ON s.StaffID = m.StaffID
WHERE 
    m.Rego = 'CH-20';

情况2:无计划标识字段时临时规则判断

若无法修改表结构,可通过维修日期等现有字段临时区分(示例:每月1号的维修视为计划内):

CREATE VIEW ViewE AS 
SELECT 
    m.DateOfMaintenance AS Maintenance_Date,
    TRIM(m.Description) AS Maintenance_Location,
    CASE 
        WHEN EXTRACT(DAY FROM m.DateOfMaintenance) = 1 THEN 'Scheduled'
        ELSE 'Not Scheduled'
    END AS Maintenance_Scheduled,
    s.FirstName || ' ' || s.LastName AS Supervisor_Name,
    s.ContactNumber AS Supervisor_Phone
FROM 
    Maintenance m
INNER JOIN 
    Staff s ON s.StaffID = m.StaffID
WHERE 
    m.Rego = 'CH-20';

额外建议

  1. Description字段用作维修地点语义不合理,建议新增MaintenanceLocation VARCHAR2(100)字段存储地点信息。
  2. 检查当前用户是否有创建视图权限:
SELECT privilege FROM user_sys_privs WHERE privilege = 'CREATE VIEW';

若无权限,联系DBA授予:

GRANT CREATE VIEW TO your_username;

内容的提问来源于stack exchange,提问作者zaid zac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:08:34