2016-10-11 6 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が実行されません。

関連する問題