Advertisement
Guest User

Untitled

a guest
Dec 9th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 2.39 KB | None | 0 0
  1. CREATE OR REPLACE PROCEDURE generate_delete(sTABLE IN VARCHAR2)
  2.  
  3. IS
  4.   cOUT CLOB; --переменная для хранения кода будущей процедуры
  5.   nFLAG NUMBER(17); --флаг для отслеживания существования таблицы
  6.   nLOG_ID NUMBER(17); --значение ключа в таблице логирования
  7.   cLOG clob := ''; --переменная для хранения последней версии кода процедуры
  8.                    --для последующей передачи в таблицу логирования
  9. BEGIN
  10.  
  11.   --проверка существования таблицы
  12.   SELECT 1 INTO nFLAG
  13.   FROM all_tables AT
  14.   WHERE AT.owner = USER
  15.   AND AT.TABLE_NAME = UPPER(sTABLE);
  16.  
  17.   --создание строки в таблице логирования
  18.   nLOG_ID := seq_id.NEXTVAL;
  19.   INSERT INTO LOGS_TABLE (SYNC_ID, USER_, PROC_NAME, DATE_)
  20.   VALUES (nLOG_ID, USER, 'p_'||UPPER(sTABLE)||'_delete', SYSDATE);
  21.  
  22.   --извлечение последней версии кода процедуры в переменную cLOG
  23. FOR cur IN (SELECT * FROM all_source
  24.       WHERE owner = USER
  25.       AND NAME = 'P_'||UPPER(sTABLE)||'_DELETE'
  26.       ORDER BY LINE)
  27. LOOP
  28.   cLOG := cLOG||cur.text;  
  29. END LOOP;
  30.  
  31.   --создание текста процедуры для удаления данных из таблицы
  32.   cOUT := 'create or replace procedure '||USER||'.p_'||UPPER(sTABLE)||'_delete('||CHR(10);
  33.   cOUT := cOUT||CHR(9)||'nSYNC_ID in NUMBER'||CHR(10)||')'||CHR(10)||'as'||CHR(10)||CHR(10)||'begin'||CHR(10);
  34.   cOUT := cOUT||CHR(9)||'delete from '||UPPER(sTABLE)||CHR(10);
  35.   cOUT := cOUT||CHR(9)||'where SYNC_ID = nSYNC_ID;'||CHR(10);
  36.   cOUT := cOUT||'end;';
  37.  
  38.   --добавление кода начальной и полученной процедур в таблицу логирования
  39.   UPDATE LOGS_TABLE SET
  40.          BEFORE_ = cLOG,
  41.          AFTER_ = cOUT
  42.   WHERE SYNC_ID = nLOG_ID;
  43.  
  44.   --выполнение процедуры, записанной в CLOB-переменной cOUT
  45.   EXECUTE IMMEDIATE cOUT;
  46.  
  47.   --обработчик исключений
  48.   EXCEPTION
  49.     --в аргументе указана несуществующая таблица
  50.     WHEN NO_DATA_FOUND THEN
  51.       RAISE_APPLICATION_ERROR(-20004, 'NO DATA FOUND');
  52.      
  53. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement