为什么我的查询产生错误“ORA-00933:SQL命令未正确结束”?

时间:2009-04-18 19:52:48

标签: sql oracle ora-00933

我的查询:

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

6 个答案:

答案 0 :(得分:2)

你得到这个错误的确切原因是你有这个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'

在任何情况下,正如其他人指出的那样,如果你修复了这个语法问题,你只会得到关于缺少列名的其他错误消息。

答案 1 :(得分:1)

首先,使用分号分隔查询并修复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'

答案 2 :(得分:0)

在升级中看起来你想要一个AND

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

答案 3 :(得分:0)

在过去7年左右的时间里,我根本没有使用过Oracle,但是你不需要一个;在陈述结束时?

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

创建视图cambiodatos AS 选择     a.last_name ||','|| a.first_name AS“Nombre”,     a.salary AS“Salario”,     b.name AS“Nombre Departamento”,     c.name AS“Nombre de Region” 从     s_emp a,s_dept b,s_region c 哪里     a.dept_id = b.id AND b.region_id = c.id; / *缺少分号? * /

UPDATE      cambiodatos 组      name ='北美' 哪里      last_name ='Biri'||','|| first_name ='Ben'/ *缺少an和last_name =<> AND first_name =<> * /