删除语句不删除记录

时间:2017-08-19 06:45:04

标签: sql oracle plsql

任何人都知道为什么不删除学生表中的记录。当表是空的并且我首先运行匿名块它运行正常,但是当我再次运行它时我得到关于重复主键的错误,但这应该无关紧要,因为每次运行块时它应该删除所有记录桌子??我对SQL比较陌生,所以感谢任何帮助。

我应该补充一下,当我运行代码时,程序似乎工作得很好。

这是我的功能:

 CREATE OR REPLACE FUNCTION DELETE_ALL_STUDENTS RETURN NUMBER AS
    BEGIN
    DELETE FROM STUDENTS;
    END;

这是我的程序:

 create or replace PROCEDURE DELETE_ALL_STUDENTS_VIASQLDEV AS
    BEGIN
    dbms_output.put_line('--------------------------------------------');
    dbms_output.put_line('Deleting all student rows');

    END;

这是我正在运行的匿名块,看它是否有效:

begin
DELETE_ALL_STUDENTS_VIASQLDEV;
ADD_STUDENT_VIASQLDEV(1,'Fred   Smith');
ADD_STUDENT_VIASQLDEV(2,'Sue    Davis');
ADD_STUDENT_VIASQLDEV(3,'Emma   Jones');
end;

1 个答案:

答案 0 :(得分:3)

  

“我的功能不执行删除吗?”

如果你打电话给它,但唉,你不这样做。

这不是SQL问题,这是一个逻辑问题。如果我们不洗碗,菜肴仍然很脏。同样,如果您不调用删除记录的例程,则不会删除记录。

您需要在程序中调用该函数。不知道为什么你把它变成了一个函数,它无论如何都不会编译,因为它没有RETURN子句。所以,让我们解决这个问题。

CREATE OR REPLACE FUNCTION DELETE_ALL_STUDENTS RETURN NUMBER AS
BEGIN
    DELETE FROM STUDENTS;
    return sql%rowcount; -- how many rows were deleted
END;
/

现在我们称之为:

create or replace PROCEDURE DELETE_ALL_STUDENTS_VIASQLDEV AS
    n number;  
BEGIN
    dbms_output.put_line('--------------------------------------------');
    dbms_output.put_line('Deleting all student rows');
    n := DELETE_ALL_STUDENTS;
    dbms_output.put_line('No of students deleted = '|| to_char(n));
END;

因此,当您运行匿名阻止时,现有学生将被删除并替换为新学生。