任何人都知道为什么不删除学生表中的记录。当表是空的并且我首先运行匿名块它运行正常,但是当我再次运行它时我得到关于重复主键的错误,但这应该无关紧要,因为每次运行块时它应该删除所有记录桌子??我对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;
答案 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;
因此,当您运行匿名阻止时,现有学生将被删除并替换为新学生。