процедура oracle plsql динамический подсчет таблиц в цикле курсора

#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 пусто.