【问题标题】:Why does my query produce error "ORA-00933: SQL command not properly ended"?为什么我的查询会产生错误“ORA-00933:SQL 命令未正确结束”?
【发布时间】:2010-10-20 07:52:19
【问题描述】:

我的查询:

CREATE VIEW cambiodatos AS 
SELECT 
    a.last_name||','||a.first_name AS "Nombre", 
    a.salary AS "Salario", 
    b.name AS "Nombre Departamento", 
    c.name AS "Nombre de Region"
FROM 
    s_emp a, s_dept b, s_region c
WHERE 
    a.dept_id = b.id AND b.region_id = c.id

UPDATE 
     cambiodatos 
SET 
     name = 'North America'
WHERE 
     last_name = 'Biri'||','||first_name = 'Ben'

错误:

ORA-00933: SQL command not properly ended

【问题讨论】:

    标签: sql oracle ora-00933


    【解决方案1】:

    您收到该错误的确切原因是您有这个 WHERE 子句:

    last_name = 'Biri'||','||first_name = 'Ben'
    

    这不是合法的语法。

    这将是:

    last_name = 'Biri' AND first_name = 'Ben'
    

    或者是这样的:

    name = 'Biri'||','||'Ben'
    

    但是你可以这样写:

    name = 'Biri,Ben'
    

    问题是在我看来您使用的是第二个 ||那里是一个 AND 子句,但这不适合您尝试添加的逗号。

    也许您正在尝试执行此操作?

    last_name || ',' || first_name = 'Biri,Ben'
    

    在任何情况下,正如其他人所指出的,如果您解决了该语法问题,您只会收到有关缺少列名的其他错误消息。

    【讨论】:

      【解决方案2】:

      首先,用分号分隔您的查询并修复您的SET 条件:

      CREATE VIEW cambiodatos AS 
      SELECT 
          a.last_name||','||a.first_name AS "Nombre", 
          a.salary AS "Salario", 
          b.name AS "Nombre Departamento", 
          c.name AS "Nombre de Region"
      FROM 
          s_emp a, s_dept b, s_region c
      WHERE 
          a.dept_id = b.id AND b.region_id = c.id;
      
      UPDATE 
           cambiodatos 
      SET 
           name = 'North America'
      WHERE 
           last_name = 'Biri'
           AND first_name = 'Ben'
      

      这就是你的错误ORA-00933的原因

      其次,您的UPDATE 语句将失败,因为您创建的视图不包含字段name

      此查询将编译:

      UPDATE 
           cambiodatos 
      SET 
           "Nombre de Region" = 'North America'
      WHERE 
           "Nombre" = 'Biri, Ben'
      

      ,但很可能会失败,因为在此视图中 s_region 不是 key-preserved

      要更新,请改用这个:

      MERGE
      INTO    s_region c
      USING   (
              SELECT  b.region_id
              FROM    s_emp a, s_dept b
              WHERE   a.last_name || ',' || a.first_name = 'Biri, Ben'
                      AND b.id = a.dept_id
              ) q
      ON      c.id = q.region_id
      WHEN MATCHED THEN
      UPDATE
      SET     c.name = 'North America'
      

      【讨论】:

        【解决方案3】:

        看起来你想在更新中使用 AND

        UPDATE 
             cambiodatos 
        SET 
             name = 'North America'
        WHERE 
             last_name = 'Biri' AND first_name = 'Ben'
        

        【讨论】:

        • last_name 或 first_name 在视图中都不是列。
        • 正确,但修复该问题将消除有问题的错误消息,但当然它之后会产生不同的错误消息。
        【解决方案4】:

        在过去 7 年左右的时间里,我根本没有使用过 Oracle,但您不需要 ;在语句的末尾?

        【讨论】:

        • 不,Oracle SQL 语句的末尾不需要分号,但可以用它告诉 sqlplus 语句已完成并发送。但是,/ 在 SQL 语句之后的一行中也可能发生这种情况。没有两者,语句将不会发送到数据库服务器,因此不会产生命令结束错误。
        • @Shannon Severance 当然,你是对的,但这正是我试图向他解释的(即使 Quassnoi 做得更好)。正如甲骨文告诉他的那样,声明没有正确结束,我认为他是从 sqlplus 发送的。这不是特定于 oracle 的东西,大多数数据库的工作方式都是一样的。 ';'几乎总是有效的,但大多数也有替代的结局。在这种情况下,我很确定整个语句(使用 CREATE VIEW 和 UPDATE 已被处理,当它看到 UPDATE 关键字时,它会吐槽它,因为很明显 CREATE VIEW 语句一定是错误地结束了。
        • 你比我读得更仔细。所以不会让我纠正我的投票。对此感到抱歉。
        【解决方案5】:

        首先,我认为您的 UPDATE 命令格式不正确。其次,您使用的是基础表中的字段,而不是运行更新的视图。另外,我认为您不能更新基于联接的视图。请参阅对此question 的回复。如果你可以看起来像这样。

        UPDATE 
             cambiodatos 
        SET 
             [Nombre de Region] = 'North America'
        WHERE 
             Nombre = 'Biro, Ben'
        

        【讨论】:

          【解决方案6】:

          创建视图 cambiodatos AS 选择 a.last_name||','||a.first_name AS "Nombre", a.salary 作为“薪水”, b.名称为“Nombre Departamento”, c.name AS “区域名称” 从 s_emp a, s_dept b, s_region c 在哪里 a.dept_id = b.id AND b.region_id = c.id ; /* 缺少分号? */

          更新 坎比达托斯 放 名称 = '北美' 在哪里 last_name = 'Biri'||','||first_name = 'Ben' /* 缺少一个 And last_name = AND first_name = */

          【讨论】:

            猜你喜欢
            • 2011-05-13
            • 1970-01-01
            • 2014-10-07
            • 1970-01-01
            • 2012-02-14
            • 1970-01-01
            • 1970-01-01
            • 2020-02-29
            • 1970-01-01
            相关资源
            最近更新 更多