SQL 从 Oracle 中删除两个 table

SQL Delete from two table in Oracle

我必须删除 table "USERS" 中的行(包含 userId)。这是我的查询:

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

但首先我想从 table "USERS_DATA"(USERS 的女儿)中删除该用户,该用户还包含 "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

与其他一些 RDBMS 不同,Oracle 不允许您在同一 SQL 命令中传递两个语句(这有助于防止 SQL 注入)。

您可以尝试将两个查询包装在一个匿名 PL/SLQ 块中:

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

这将允许您同时执行两个 DML 语句,因为它们是包含 PL/SQL 块的单数的一部分。

不幸的是,我不熟悉 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;
/

然后你就可以调用这个过程了。