DELETE

说明

从一个基本表或视图中删除数据

语法

delete ::=

returning_clause ::=

参数

table_name

一个现有的表或视图。

Condition

将被删除的行所要满足的条件。请参见 SELECT: WHERE 子句说明。

single_row_expression

返回表中一行数据的表达式。

variable_name

存储所选列值的变量。

注解

DELETE语句从指定的表或视图中删除所有满足WHERE条件的行。要进行DELETE操作,用户必须拥有表table_name上的DELETE权限(注意DELETE没有列权限的概念,因为不可能只删除一个行中的部分属性)。

当在临时表上执行DELETE语句删除了临时表中的所有数据时,不会删除临时表在该会话上的实例,不能解除临时表与该会话的绑定。

RETURNING子句:

returning语句中single_row_expression可以有多列,即类似Returning column1, column2 Into var1, var2形式,暂不支持返回多行结果的表达式,不支持使用聚集函数的表达式。

single_row_expression的类型支持大对象(BLOB、CLOB)及普通数据类型,若为大对象类型则将loblocator(而非数据本身)返回给INTO后相应变量。不可对delete语句中returning获取的loblocator进行读、写操作。

variable_name为存储列值的变量,可以是PL/SQL语句中的变量(如i),也可以是绑定参数的变量(如:var1)。

insert、delete、update语句中支持Returning功能,merge语句、EXECUTE IMMEDIATE子句不支持此功能。

支持在DELETE语句中使用DBLINK远端表。

示例

示例1: 删除所有元组

--  清理环境
DROP TABLE tab1 CASCADE;


--  创建表并插入数据
CREATE TABLE tab1 (a INT, b INT);

INSERT INTO tab1 VALUES (1, 11);
INSERT INTO tab1 VALUES (2, 12);
INSERT INTO tab1 VALUES (3, 13);


SELECT * FROM tab1 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |11          |
------------------------
2           |12          |
------------------------
3           |13          |
总数目:3


--  删除所有元组
DELETE FROM tab1;


SELECT * FROM tab1 ORDER BY a;
A(int)      |B(int)      |
总数目:0


--  删除表
DROP TABLE tab1;

示例2: 删除部分元组

--  清理环境
DROP TABLE tab2 CASCADE;


--  创建表并插入数据
CREATE TABLE tab2 (a INT, b INT);

INSERT INTO tab2 VALUES (1, 11);
INSERT INTO tab2 VALUES (2, 12);
INSERT INTO tab2 VALUES (3, 13);
INSERT INTO tab2 VALUES (4, 14);
INSERT INTO tab2 VALUES (5, 15);
INSERT INTO tab2 VALUES (6, 16);


SELECT * FROM tab2 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |11          |
------------------------
2           |12          |
------------------------
3           |13          |
------------------------
4           |14          |
------------------------
5           |15          |
------------------------
6           |16          |
总数目:6


--  删除部分元组
DELETE FROM tab2 WHERE a % 2 = 0;


SELECT * FROM tab2 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |11          |
------------------------
3           |13          |
------------------------
5           |15          |
总数目:3


--  删除表
DROP TABLE tab2;

示例3: 使用 RETURNING INTO

--  清理环境
DROP PROCEDURE proc3 CASCADE;
DEALLOCATE PREPARE pp3;
DROP TABLE tab3 CASCADE;


--  创建表并插入数据
CREATE TABLE tab3 (a INT, b INT);

INSERT INTO tab3 VALUES (1, 11);
INSERT INTO tab3 VALUES (2, 12);
INSERT INTO tab3 VALUES (3, 13);
INSERT INTO tab3 VALUES (4, 14);
INSERT INTO tab3 VALUES (5, 15);
INSERT INTO tab3 VALUES (6, 16);


SELECT * FROM tab3 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |11          |
------------------------
2           |12          |
------------------------
3           |13          |
------------------------
4           |14          |
------------------------
5           |15          |
------------------------
6           |16          |
总数目:6


--  创建查询计划(使用 RETURNING INTO)
PREPARE pp3 AS DELETE FROM tab3 WHERE a = 5 RETURNING b INTO ?;

--  执行查询计划
EXECUTE pp3('');


--  创建存储过程(PL/SQL 使用 RETURNING INTO)
CREATE OR REPLACE PROCEDURE proc3 AS
    v1 INT;
    v2 INT;
BEGIN
    DELETE FROM tab3 WHERE a = 3 RETURN a, b INTO v1, v2; 
    DBMS_OUTPUT.PUT_LINE(v1);
    DBMS_OUTPUT.PUT_LINE(v2);
END;

/


--  执行存储过程
EXEC proc3;


--  删除存储过程、查询计划和表
DROP PROCEDURE proc3;
DEALLOCATE PREPARE pp3;
DROP TABLE tab3;