У меня есть изменение модели данных в таблице: добавить новый столбец.но есть 4-5 procedure/pkg/views
, где присутствуют все столбцы таблицы.Мы должны добавить этот новый столбец как новую строку в proc/pkg/view
.как мы можем достичь этого?
это должно быть похоже, я даю ввод в качестве нового столбца, и новый столбец должен добавляться везде, как и во всех proc/pkg/view
.
Я пытался взять номер строкииз таблицы Dba_source
и манипулятора pkg DBMS_METADATA.GET_DDL()
.Но формат идет не правильно.Используется цикл, новая строка добавляется в конце процедуры, что не является обязательным.
КОД: Разработано до сих пор:
DECLARE
PROC_v VARCHAR2 (4000);
l_sql VARCHAR2 (9000 CHAR);
V_NEW_COL VARCHAR2 (10) := 'INST_NAME';
v_byte NUMBER (5);
v_byte_st NUMBER (5) := 1;
v_blnk_cnt NUMBER;
v_line_ed NUMBER (5);
v_line_st NUMBER (5);
TYPE src_line IS TABLE OF NUMBER (5);
l_src_line src_line;
BEGIN
SELECT line
BULK COLLECT INTO l_src_line
FROM DBA_SOURCE
WHERE OWNER = 'TEST'
AND TYPE = 'PROCEDURE'
AND NAME = 'PROCESS_EMP'
AND (TEXT LIKE '%CURRENCY%' OR TEXT = 'END;'); --Currency is last column in the table
v_line_st := 1;
FOR j IN l_src_line.FIRST .. l_src_line.LAST
LOOP
DBMS_OUTPUT.put_line ('Line start' || v_line_st);
v_line_ed := l_src_line (j);
DBMS_OUTPUT.put_line ('Line End' || v_line_ed);
SELECT COUNT (1)
INTO v_blnk_cnt
FROM DBA_SOURCE
WHERE OWNER = 'TEST'
AND TYPE = 'PROCEDURE'
AND NAME = 'PROCESS_EMP'
AND text = CHR (10)
AND LINE BETWEEN v_line_st AND v_line_ed;
SELECT SUM (LENGTH (TEXT)) + v_blnk_cnt * 10
INTO v_byte
FROM DBA_SOURCE
WHERE OWNER = 'TEST'
AND TYPE = 'PROCEDURE'
AND NAME = 'PROCESS_EMP'
AND LINE BETWEEN v_line_st AND v_line_ed;
v_line_st := l_src_line (j) + 1;
--dbms_output.put_line(v_line_st);
DBMS_OUTPUT.put_line (v_byte);
DBMS_OUTPUT.put_line (v_byte_st);
PROC_v: =
DBMS_LOB.SUBSTR (
(DBMS_METADATA.get_ddl ('PROCEDURE', 'PROCESS_EMP')),
v_byte,
v_byte_st); -- to extract Source code and convert HUGECLOB into VARCHAR
PROC_v := PROC_v || ' ' || V_NEW_COL;
/*CASE WHEN l_src_line.LAST THEN
PROC_v:= PROC_v || CHR(10) ||'/';
ELSE
PROC_v:= PROC_v||' '|| V_NEW_COL;
END CASE;*/ -- This part did not work
DBMS_OUTPUT.put_line (PROC_v);
v_byte_st := v_byte + v_byte_st;
--execute immediate l_sql;
END LOOP;
END;
/
Я даю ввод в качестве нового столбцаи новый столбец должен добавляться везде, как и во всех proc / pkg / view.Мне нужно обобщить решение позже