как получить общее количество записей, удаленных в пользовательской функции - PullRequest
2 голосов
/ 08 августа 2011

Может ли кто-нибудь помочь мне написать пользовательскую функцию для удаления старых записей и возврата общего количества одновременно?Вот что у меня сейчас.Часть удаления работает хорошо, но каким-то образом счетчик возврата - ничто.

CREATE OR REPLACE FUNCTION DELETE_OLD(delete_date IN DATE) 
RETURN NUMBER IS
counter NUMBER;
BEGIN
  LOOP
    DELETE FROM MY_TEST_TABLE WHERE TEST_DATA_LOAD_DATE < delete_date AND ROWNUM   <= 100;
    counter := counter + SQL%ROWCOUNT;
COMMIT;
EXIT WHEN SQL%ROWCOUNT = 0;
  END LOOP;
  RETURN counter;

END;

Это то, как я вызываю функцию на sql_plus

SQL> VAR OUT_NUMBER
SQL> call DELETE_OLD(TO_DATE('20-05-2011', 'dd-MM-yyyy')) into :OUT_NUMBER;

и когдаЯ печатаю OUT_NUMBER, ничего не вижу.

Спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 08 августа 2011

Вы не инициализируете переменную COUNTER, поэтому она начинается со значения NULL.Добавление значений к NULL приведет к NULL, а не к значению.Поэтому, как минимум, вы бы хотели инициализировать COUNTER равным 0.

CREATE OR REPLACE FUNCTION DELETE_OLD(delete_date IN DATE) 
RETURN NUMBER IS
  counter NUMBER := 0;
BEGIN
  LOOP
    DELETE FROM MY_TEST_TABLE 
     WHERE TEST_DATA_LOAD_DATE < delete_date 
       AND ROWNUM   <= 100;
    counter := counter + SQL%ROWCOUNT;
    COMMIT;
    EXIT WHEN SQL%ROWCOUNT = 0;
  END LOOP;
  RETURN counter;
END;

Тем не менее, я был бы очень обеспокоен этим общим подходом

  • Процедуры должныделать такие вещи, как удаление данных.Функции не должны изменять данные, они должны просто выполнять вычисления.Было бы гораздо разумнее создать процедуру с параметром OUT, чем объявить ее как функцию.
  • Не имеет большого смысла удалять данные в цикле, подобном этому.Гораздо эффективнее будет просто выполнить одну инструкцию DELETE, которая удалит все данные, которые нужно удалить.
  • Добавление временных коммитов в циклы замедляет код и может увеличить вероятность появления ошибки ORA-01555.Есть очень немного случаев, когда действительно имеет смысл иметь такие временные коммиты.
2 голосов
/ 08 августа 2011

Вам нужно инициализировать счетчик значением, если вы пытаетесь добавить к нему

COUNTER NUMBER :=0;

, в противном случае вы пытаетесь добавить количество строк в ноль.Который всегда будет нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...