Ошибка Oracle при выполнении запроса -ORA-00933: команда SQL неправильно завершена - PullRequest
1 голос
/ 23 октября 2019
UPDATE FRA_SAP
SET FRA_SAP.ENT_ATTRIBUTES = FE.ENT_ATTRIBUTES
FROM FRA_SAP FES
INNER JOIN FRA_ENTITIES FE
    ON FES.ID = FE.ID

Я получаю следующую ошибку:

java.sql.SQLSyntaxErrorException: ORA-00933: SQL command not properly ended
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1059)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Oracle не поддерживает FROM или JOIN (обычно) в UPDATE. Эквивалент:

UPDATE FRA_SAP
    SET FRA_SAP.ENT_ATTRIBUTES = (SELECT FE.ENT_ATTRIBUTES
                                  FROM FRA_ENTITIES FE
                                  WHERE FES.ID = FE.ID
                                 )
    WHERE EXISTS (SELECT 1
                  FROM FRA_ENTITIES FE
                  WHERE FES.ID = FE.ID
                 );

Примечание. Если в FRA_ENTITIES есть несколько совпадающих строк, этот запрос выдаст ошибку. Эквивалентный запрос в SQL Server - с использованием вашего синтаксиса - будет использовать произвольную подходящую строку для обновления.

1 голос
/ 23 октября 2019

Вы, похоже, используете синтаксис объединения обновлений SQL Server, который не будет работать в Oracle. Одна работающая версия использует коррелированный подзапрос:

UPDATE FRA_SAP fes
SET ENT_ATTRIBUTES = (SELECT fe.ENT_ATTRIBUTES
                      FROM FRA_ENTITIES fe
                      WHERE fes.ID = fe.ID);

Следующее, что ближе к настоящему объединению обновлений, также может работать:

UPDATE 
(
    SELECT fes.ENT_ATTRIBUTES AS OLD, fe.ENT_ATTRIBUTES AS NEW
    FROM FRA_SAP fes
    INNER JOIN FRA_ENTITIES fe
        ON fes.ID = fe.ID
) t
SET t.OLD = t.NEW;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...