任何人都知道为什么它不从学生表中删除记录。当表为空并且我先运行匿名块时,它运行良好,但是随后当我再次运行它时,我会得到有关重复主键的错误,但这无关紧要,因为每次我运行该块时,它都应该从中删除所有记录桌子??我是SQL的新手,所以可以提供任何帮助。
我应该补充,该程序似乎运行良好,因为在运行代码时出现dopl。
这是我的功能:
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;
“我的功能不执行删除吗?”
如果您调用它,它会,但是a,您不会。
这不是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;
因此,当您运行匿名块时,现有学生将被删除并用新学生替换。