Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CREATE OR REPLACE PROCEDURE generate_delete(sTABLE IN VARCHAR2)
- IS
- cOUT CLOB; --переменная для хранения кода будущей процедуры
- nFLAG NUMBER(17); --флаг для отслеживания существования таблицы
- nLOG_ID NUMBER(17); --значение ключа в таблице логирования
- cLOG clob := ''; --переменная для хранения последней версии кода процедуры
- --для последующей передачи в таблицу логирования
- BEGIN
- --проверка существования таблицы
- SELECT 1 INTO nFLAG
- FROM all_tables AT
- WHERE AT.owner = USER
- AND AT.TABLE_NAME = UPPER(sTABLE);
- --создание строки в таблице логирования
- nLOG_ID := seq_id.NEXTVAL;
- INSERT INTO LOGS_TABLE (SYNC_ID, USER_, PROC_NAME, DATE_)
- VALUES (nLOG_ID, USER, 'p_'||UPPER(sTABLE)||'_delete', SYSDATE);
- --извлечение последней версии кода процедуры в переменную cLOG
- FOR cur IN (SELECT * FROM all_source
- WHERE owner = USER
- AND NAME = 'P_'||UPPER(sTABLE)||'_DELETE'
- ORDER BY LINE)
- LOOP
- cLOG := cLOG||cur.text;
- END LOOP;
- --создание текста процедуры для удаления данных из таблицы
- cOUT := 'create or replace procedure '||USER||'.p_'||UPPER(sTABLE)||'_delete('||CHR(10);
- cOUT := cOUT||CHR(9)||'nSYNC_ID in NUMBER'||CHR(10)||')'||CHR(10)||'as'||CHR(10)||CHR(10)||'begin'||CHR(10);
- cOUT := cOUT||CHR(9)||'delete from '||UPPER(sTABLE)||CHR(10);
- cOUT := cOUT||CHR(9)||'where SYNC_ID = nSYNC_ID;'||CHR(10);
- cOUT := cOUT||'end;';
- --добавление кода начальной и полученной процедур в таблицу логирования
- UPDATE LOGS_TABLE SET
- BEFORE_ = cLOG,
- AFTER_ = cOUT
- WHERE SYNC_ID = nLOG_ID;
- --выполнение процедуры, записанной в CLOB-переменной cOUT
- EXECUTE IMMEDIATE cOUT;
- --обработчик исключений
- EXCEPTION
- --в аргументе указана несуществующая таблица
- WHEN NO_DATA_FOUND THEN
- RAISE_APPLICATION_ERROR(-20004, 'NO DATA FOUND');
- END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement