2017-08-19 10 views
-4

誰もが、学生テーブルからレコードを削除しない理由を知っています。テーブルが空で、最初に匿名ブロックを実行すると正常に実行されますが、再度実行すると重複する主キーについてエラーが発生しますが、ブロックを実行するたびにすべてのレコードを削除する必要がありますテーブル??私はSQLに比較的新しいので、どんな助けもありがたいです。deleteステートメントレコードを削除しない

私はコードを実行すると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; 
+0

あなたが投稿した 'DELETE_ALL_STUDENTS_VIASQLDEV'のバージョンは何も削除しません。ちょうど出力を表示します。 – APC

+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; 

、あなたはあなたの匿名ブロックを実行すると、既存の学生が削除され、新しいものに置き換えられます。

+0

どうもありがとう!私はちょうどそのような概念のいくつかの周りに私の頭を包むためにしばらく時間がかかるので、学習を始めた。 –

関連する問題