#plsql
#plsql
Вопрос:
Я хочу обновить все таблицы, имеющие столбец ABC.Необходимо пропустить таблицы, в которых нет данных.У меня возникли проблемы с проверкой количества таблиц в цикле курсора. Код PLSQL
create or replace procedure testp is
CURSOR c_testp
IS
SELECT table_name,
column_name
FROM all_tab_columns
WHERE column_name IN('ABC')
ORDER BY table_name;
c int;
BEGIN
FOR table_rec IN c_testp
LOOP
BEGIN
SELECT COUNT(*)
INTO c
FROM table_rec.table_name;
IF(c>0) THEN
query := 'update '||table_rec.table_name||' set '||table_rec.column_name ||'= xyz';
EXECUTE IMMEDIATE query;
COMMIT;
END IF;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('data not found');
WHEN OTHERS THEN
dbms_output.put_line('others');
END;
END LOOP;
END;
Комментарии:
1. Вам не нужно проверять количество строк. Если в таблице нет строк
update
, она ничего не сделает. Просто удалите эту часть (но чтобы ответить на вопрос: для этого вам также нужен динамический SQL).
Ответ №1:
В вашем коде используйте это:
EXECUTE IMMEDIATE 'SELECT count(*) FROM ' || table_rec.table_name INTO c;
вместо этого:
SELECT COUNT(*)
INTO c
FROM table_rec.table_name;
Однако, как упоминалось в комментариях, на самом деле нет необходимости выполнять эту проверку условий, поскольку no update
будет выполняться, когда table
пусто.