2016-10-11 114 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