#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;