Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Why RETURNING COUNT(*) does not return deleted row count when used with DEL

555205Mar 20 2009 — edited Apr 6 2009
Hi,

I have a question why RETURNING COUNT(*) does not return deleted row count when used with DELETE clause, but it returns correct result when I use COUNT(1). Result should be the same.

Test script four you if you don't beleve me :) (I use Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit)

set serveroutput on

CREATE TABLE dummy_table
(
dummy_id INTEGER
)
/

BEGIN
INSERT INTO dummy_table(dummy_id) VALUES(1);
INSERT INTO dummy_table(dummy_id) VALUES(2);
END;
/

SELECT *
FROM dummy_table
/

DECLARE
v_rows_deleted INTEGER;
BEGIN
DELETE dummy_table
WHERE dummy_id = 1
RETURNING COUNT(*) INTO v_rows_deleted;
dbms_output.put_line('rows_deleted: '||v_rows_deleted);
END;
/

SELECT *
FROM dummy_table
/

DECLARE
v_rows_deleted INTEGER;
BEGIN
DELETE dummy_table
WHERE dummy_id = 2
RETURNING COUNT(1) INTO v_rows_deleted;
dbms_output.put_line('rows_deleted: '||v_rows_deleted);
END;
/

SELECT *
FROM dummy_table
/

drop table dummy_table
/

I have run it my self and it works like this

SQL> set serveroutput on
SQL>
SQL> CREATE TABLE dummy_table
2 (
3 dummy_id INTEGER
4 )
5 /

Table created.

SQL>
SQL> BEGIN
2 INSERT INTO dummy_table(dummy_id) VALUES(1);
3 INSERT INTO dummy_table(dummy_id) VALUES(2);
4 END;
5 /

PL/SQL procedure successfully completed.

SQL>
SQL> SELECT *
2 FROM dummy_table
3 /

DUMMY_ID
----------
1
2
--created table with two rows
SQL>
SQL> DECLARE
2 v_rows_deleted INTEGER;
3 BEGIN
4 DELETE dummy_table
5 WHERE dummy_id = 1
6 RETURNING COUNT(*) INTO v_rows_deleted;
7 dbms_output.put_line('rows_deleted: '||v_rows_deleted);
8 END;
9 /
rows_deleted: 0
-- just deleted one row but rows deleted shows 0
PL/SQL procedure successfully completed.

SQL>
SQL> SELECT *
2 FROM dummy_table
3 /

DUMMY_ID
----------
2
-- as we can see row is actually deleted
SQL>
SQL> DECLARE
2 v_rows_deleted INTEGER;
3 BEGIN
4 DELETE dummy_table
5 WHERE dummy_id = 2
6 RETURNING COUNT(1) INTO v_rows_deleted;
7 dbms_output.put_line('rows_deleted: '||v_rows_deleted);
8 END;
9 /
rows_deleted: 1
-- deleting, but this time with count (1)
PL/SQL procedure successfully completed.

SQL>
SQL> SELECT *
2 FROM dummy_table
3 /

no rows selected
--and again row is deleted
SQL>
SQL> drop table dummy_table
2 /

Table dropped.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on May 4 2009
Added on Mar 20 2009
9 comments
11,074 views