Необходимо изменить все связанные объекты (в одном коротком), когда новый столбец добавлен в таблицу - PullRequest
1 голос
/ 19 мая 2019

У меня есть изменение модели данных в таблице: добавить новый столбец.но есть 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.Мне нужно обобщить решение позже

...