Создание автоматического универсального скрипта с использованием таблиц метаданных для вставки в другую таблицу с той же структурой

#sql #oracle #plsql #oracle11g #plsqldeveloper

#sql #Oracle #plsql #оракул11g #plsqldeveloper

Вопрос:

По сути, я хочу создать скрипт, который автоматически выбирает из одной таблицы и вставляет в новую таблицу в plsql (структура обеих таблиц одинакова). Это должен быть универсальный вариант, который может работать для любой таблицы. Например, используя dba_tab_cols и просто передавая имя таблицы в цикле (получите запрос выбора таблицы) и используйте это для вставки в другую таблицу.

что-то вроде приведенного ниже, но это дает мне ошибку bcoz дополнительного ‘,’ в операторе INSERT INTO в конце Ошибка SQL: ORA-00936: отсутствующее выражение

        FOR i IN (SELECT 'v_rec(i).'||column_name||',' AS col 
                    FROM dba_tab_cols 
                   WHERE table_name=v_table_name AND owner = 'XYZ'
                ORDER BY column_id 
                  ) LOOP
           v_col := v_col||i.col;
        END LOOP;
      DBMS_OUTPUT.PUT_LINE(v_col);
     END;

     v_sql_data :='
     DECLARE 
        TYPE c_cur IS REF CURSOR;
        v_cur c_cur;
        TYPE t_table IS TABLE OF '||v_table_name||'%ROWTYPE;
        v_rec t_table;
        v_sql VARCHAR2(4000 CHAR);
     BEGIN
        v_sql := ''select * from '||v_table_name||''';
        OPEN v_cur FOR v_sql;
        LOOP
        FETCH v_cur  BULK COLLECT INTO v_rec LIMIT 10000 ;
        EXIT WHEN v_rec.COUNT=0;
      FORALL i IN 1..v_rec.COUNT
         INSERT INTO '||v_new_table_name||' VALUES ('||v_col||');
           COMMIT;
       END LOOP;
     END;
     ';
   EXECUTE IMMEDIATE v_sql_data;
 

Может кто-нибудь, пожалуйста, подсказать.?

Спасибо.

Ответ №1:

Я бы сказал, что ваша проблема заключается не в лишней запятой, а во всех этих неправильно расставленных и непревзойденных одинарных кавычках. Для начала:

 v_sql_data :='
 

Что эта одинарная кавычка делает там сама по себе? Все, что следует за ним, считается буквальной строкой до тех пор, пока анализатор не найдет завершающую кавычку.

Снова:

 TYPE t_table IS TABLE OF '||v_table_name||'%ROWTYPE;
 

посмотрите на то, что заключено в этих двух цитатах. Ваш код полон такого рода вещей.

И мы даже не знаем, как начинается ваш PL / SQL. Блок (сохраненный или анонимный), конечно, не начинается с оператора FOR .

Но, в конце концов, вы делаете это WAAAYYYY сложнее, чем нужно. Почему не простой

 create table_b as select * from table_a;