簡體   English   中英

為什么我的查詢會產生錯誤“ORA-00933:SQL 命令未正確結束”?

[英]Why does my query produce error "ORA-00933: SQL command not properly ended"?

我的查詢:

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

您收到該錯誤的確切原因是您有這個 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'

在任何情況下,正如其他人指出的那樣,如果您解決了該語法問題,您只會收到有關缺少列名的其他錯誤消息。

首先,用分號分隔您的查詢並修復您的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'

看起來您想要更新中的 AND

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

在過去 7 年左右的時間里,我根本沒有使用過 Oracle,但您不需要 ; 在聲明的結尾?

首先,我認為您的 UPDATE 命令格式不正確。 其次,您使用的是基礎表中的字段,而不是運行更新所針對的視圖。 另外,我認為您無法更新基於連接的視圖。 請參閱對這個問題的回答 如果你可以看起來像這樣。

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

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' /* 缺少一個 And last_name = <> AND first_name = <> */

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM