В сценарии Oracle PL / SQL, предназначенном для запуска более одного раза, нужно ли удалять коллекцию? - PullRequest
2 голосов
/ 24 февраля 2011

У меня есть коллекция sysid, которые я использую для итерации в нескольких циклах поиска. Этот сценарий предназначен для регулярного запуска, поэтому я хотел бы знать, сохраняется ли коллекция в базе данных и должна ли она быть очищена, или сценарий в порядке как есть.

Кроме того, я новичок в PL / SQL, поэтому, если вы видите что-то не так со скриптом, пожалуйста, дайте мне знать.

Это будет работать на Oracle 10g и 11g.

Спасибо

DECLARE

TYPE sSysid IS TABLE OF person.sysid%TYPE
    INDEX BY PLS_INTEGER;

l_sSysid sSysid;

BEGIN
    SELECT sysid
    BULK COLLECT INTO l_sSysid
        FROM person
        where purge_in_process = 1;

FORALL i IN l_sSysid.FIRST .. l_sSysid.LAST
    delete from person_attribute where property_pk like concat(l_sSysid(i), '%');

FORALL i IN l_sSysid.FIRST .. l_sSysid.LAST
    delete from person_property where person_sysid = l_sSysid(i);

FORALL i IN l_sSysid.FIRST .. l_sSysid.LAST
    delete from person where sysid = l_sSysid(i);


END;
/
commit;

Ответы [ 2 ]

5 голосов
/ 24 февраля 2011

Коллекция является локальной переменной, поэтому она больше не будет существовать после завершения выполнения блока. Там не будет необходимости очищать это. В зависимости от количества строк в таблице PERSON, где PURGE_IN_PROCESS будет равно 1, вы можете использовать предложение LIMIT, чтобы избежать чрезмерного использования памяти PGA.

Идея анонимного блока PL / SQL, который регулярно запускается, однако, немного чужды мне. Если вы хотите, чтобы код выполнялся регулярно, я настоятельно рекомендую вам создать хранимую процедуру, а не анонимный блок, а затем запланировать ее регулярное выполнение. Это открывает возможность использовать средства планирования базы данных (DBMS_JOB и DBMS_SCHEDULER) для запуска процесса и позволяет другим приложениям вызывать его также в случае необходимости. Кроме того, вы получите такие преимущества, как отслеживание зависимостей в базе данных.

0 голосов
/ 26 февраля 2014

Джастин прав;но для полноты картины я просто добавлю, что если вы когда-нибудь решите преобразовать это в сохраненный PACKAGE, вам нужно будет проявить особую осторожность, потому что все, что вы объявляете в спецификации PACKAGE, сохраняет свое значение в течение всего сеанса.

...