2016-03-16 3 views
2

Мне нужно удалить строку (содержащую userId) в таблице «ПОЛЬЗОВАТЕЛИ». Это мой запрос:SQL Удаление из двух таблиц в Oracle

@SqlUpdate("delete from USERS where userId = :userId ") 
void removeUser(@Bind("userId") String userId); 

Но сначала я хочу, чтобы удалить этого пользователя из таблицы «USERS_DATA» (то есть дочь ПОЛЬЗОВАТЕЛЕЙ), которые также содержат «USERID». Как я могу сделать? Я попытался это:

@SqlUpdate("delete from USERS_DATA where userId = :userId " + 
     " and delete from USERS where userId = :userId") 
void removeUser(@Bind("userId") String userId); 

но консоль сказать мне: java.sql.SQLSyntaxErrorException: ORA-00936: missing expression

+0

Вы пробовали использовать два отдельных запроса в одной транзакции? –

+0

да, он пишет ошибку: «duplicate method removeUser». Но я хочу сделать все с помощью одного метода – panagulis72

+0

, почему вы хотите, чтобы это было одним способом в слое данных? у вас все еще будет только один метод на уровне сервиса, который удаляет данные пользователя и пользователя –

ответ

0

В отличие от некоторых других СУБД, Oracle не позволяет передать два оператора в одной команде SQL (это помогает предотвратить инъекции SQL) ,

Вы можете попробовать использовать оберточную оба запроса в блоке анонимного PL/SLQ:

BEGIN 
    delete from USERS_DATA where userId = :userId; 
    delete from USERS  where userId = :userId; 
END; 
/

Это позволит вам выполнить оба заявления DML вместе, поскольку они являются частью единственного числа, содержащего/SQL блок PL.

К сожалению, я не знаком с этим аннотаций синтаксиса Java, так что я не могу помочь вам преобразовать его в Java, но я бы догадаться:

@SqlUpdate("BEGIN " + 
    "delete from USERS_DATA where userId = :userId; " + 
    "delete from USERS  where userId = :userId; " + 
"END;") 
void removeUser(@Bind("userId") String userId); 

В качестве альтернативы, вы можете создать процедуру в Oracle:

CREATE OR REPLACE PROCEDURE delete_user(
    in_userID USERS_DATA.USERID%TYPE 
) 
AS 
BEGIN 
    DELETE FROM USERS_DATA WHERE userId = in_userId; 
    DELETE FROM USERS  WHERE userId = in_userId; 
END; 
/

И вы можете просто вызвать эту процедуру.

+0

console log: Нашел символ «конец файла», а не один из следующих:! begin case declare end exception exit для goto if loop mod ! null pragma raise return select update while with ! <идентификатор><двойное кавычки delimited-iden – panagulis72

+0

Как я уже сказал, я не знаком с этим синтаксисом java (я предполагаю, что это аннотация из рамки Spring), и вам придется решить, как выполнить PL/SQL через него (возможно, с помощью 'PreparedStatement'). – MT0

+0

В качестве альтернативы вы можете обернуть необходимые функции удаления в хранимую процедуру и просто вызвать эту процедуру. – MT0

Смежные вопросы