Почему мой запрос выдает ошибку «ORA-00933: команда SQL не завершена должным образом»? - PullRequest
2 голосов
/ 18 апреля 2009

Мой запрос:

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 ]

2 голосов
/ 20 апреля 2009

Точная причина, по которой вы получаете эту ошибку, заключается в том, что у вас есть следующее предложение 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 голос
/ 20 апреля 2009

Сначала разделите ваши запросы точкой с запятой и исправьте условия 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'
0 голосов
/ 20 апреля 2009

CREATE VIEW cambiodatos AS ВЫБРАТЬ a.last_name || ',' || a.first_name AS "Nombre", а.салар а.с. "саларио", б.имя 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' / * отсутствует And last_name = <> AND first_name = <> * /

0 голосов
/ 19 апреля 2009

Во-первых, я думаю, что ваша команда UPDATE плохо отформатирована. Во-вторых, вы используете поля из базовых таблиц вместо представления, для которого выполняется обновление. Кроме того, я не думаю, что вы можете обновить представление, основанное на соединении. Смотрите ответ на этот вопрос . Если бы вы могли выглядеть так.

UPDATE 
     cambiodatos 
SET 
     [Nombre de Region] = 'North America'
WHERE 
     Nombre = 'Biro, Ben'
0 голосов
/ 19 апреля 2009

Я не пользовался Oracle вообще последние 7 лет или около того, но вам это не нужно; в конце заявления?

0 голосов
/ 19 апреля 2009

Похоже, вы хотите AND в обновлении

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