DELETE¶
说明¶
从一个基本表或视图中删除数据
参数¶
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;