2016-10-11 115 views
1

我想更新所有具有ABC列的表。需要跳过没有数据的表。我在检查表中的表的计数时遇到问题游标循环。 PLSQL代码oracle 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; 
+0

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

回答

0

在代码中,使用此:

EXECUTE IMMEDIATE 'SELECT count(*) FROM ' || table_rec.table_name INTO c; 

,而不是这样的:

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

然而,正如在评论中提到 - 但是实际上没有必要执行条件检查,因为当table为空时将执行update