如何使用另一个游标的条件从游标中删除行?

时间:2013-10-28 08:31:17

标签: oracle plsql

我有2个游标,它们具有相互连接的唯一编号,例如Student_ID。

如果在第一个游标中找到相同的Student_ID,我必须从第二个游标中删除它。

我发现了类似的东西但却不明白它是怎么回事:

open c1;  
fetch c1 into cnumber;

if c1%notfound then
   cnumber := 9999;

else
   DELETE FROM courses_tbl
     WHERE CURRENT OF c1;

   COMMIT;

这是我第一次做Oracle PL / SQL。

1 个答案:

答案 0 :(得分:0)

1)第一个例子反映了你的方法。这不错,但最好尽量减少删除语句的数量。

CREATE TABLE so_courses_tbl
(
    col VARCHAR2(10)
)
;
-- table so_courses_tbl created.

INSERT INTO so_courses_tbl VALUES(1);
-- 1 rows inserted.

DECLARE
    CURSOR c1 IS
        SELECT  1
        FROM    DUAL;

    cnumber  NUMBER;
BEGIN
    OPEN  c1;
    FETCH c1 INTO cnumber;
    CLOSE c1;

    DELETE
    FROM    so_courses_tbl
    WHERE   col = cnumber;

    COMMIT;
END;
-- anonymous block completed

SELECT COUNT(1) FROM so_courses_tbl;
-- 0

2)这就是你可以一步完成的方法。你可以使用变量是WHERE子句,使其更灵活(如果你需要它......)

INSERT INTO so_courses_tbl VALUES('X');
INSERT INTO so_courses_tbl VALUES('X');
INSERT INTO so_courses_tbl VALUES('X');
-- 1 rows inserted.
-- 1 rows inserted.
-- 1 rows inserted.

BEGIN
    DELETE
    FROM    so_courses_tbl  c
    WHERE   EXISTS
            (
                SELECT  1
                FROM    DUAL  d
                WHERE   c.col = d.dummy
            );

    DBMS_OUTPUT.PUT_LINE('Number of deleted rows: ' || SQL%ROWCOUNT);

    COMMIT;
END;
-- Number of deleted rows: 3

试一试,让我们知道它是怎么回事。