oracle plsql过程游标循环中表的动态计数

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

我想更新所有具有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;

在代码中,使用以下命令:

EXECUTE IMMEDIATE 'SELECT count(*) FROM ' || table_rec.table_name INTO c;
与此相反:

 SELECT COUNT(*)
      INTO c
      FROM table_rec.table_name; 

但是,如注释中所述-实际上不需要执行该条件检查,因为当
为空时,不会执行
更新

在代码中,使用以下命令:

EXECUTE IMMEDIATE 'SELECT count(*) FROM ' || table_rec.table_name INTO c;
与此相反:

 SELECT COUNT(*)
      INTO c
      FROM table_rec.table_name; 

但是,如注释中所述-实际上不需要执行该条件检查,因为当
为空时,不会执行
更新

您不需要检查行数。如果表中没有行,
update
将不会执行任何操作。只需删除该部分(但要回答这个问题:您也需要动态SQL),不需要检查行数。如果表中没有行,
update
将不会执行任何操作。只需删除该部分(但要回答这个问题:您也需要动态SQL)。