2016-10-11 4 views
1

Ich möchte alle Tabellen mit ABC-Spalte aktualisieren. Nötig, die Tabellen zu überspringen, die keine Daten hat. Ich habe ein Problem bei der Überprüfung der Zählung der Tabelle in a Cursorschleife. PLSQL CodeOrakel Plsql-Prozedur dynamische Zählung der Tabellen in Cursor-Schleife

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

Sie müssen die Zeilenanzahl nicht überprüfen. Wenn es keine Zeilen in der Tabelle gibt, wird das 'update' nichts tun. Entfernen Sie einfach diesen Teil (aber um die Frage zu beantworten: Sie brauchen auch dafür dynamisches SQL). –

Antwort

0

in Ihrem Code verwenden, um dies:

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

statt dessen:

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

jedoch, wie in den Kommentaren erwähnt - es gibt eigentlich keine Notwendigkeit zu erfüllen, dass Bedingungsprüfung, da keine update ausgeführt wird, wenn table leer ist.