2016-11-14 2 views
1

Ich habe gerade versucht, neue Dinge zu lernen. Ich mache nur ein Experiment, um Tabellen mit Schleifen zu analysieren. Aber, fand ich Fehler, sagteDBMS_STATS mit Looping

‚Ungültige Referenz Variable 'indx'

. Wenn ich das DBMS_STATS-Ding herausnehme und nur das Ergebnis drucke, funktioniert es. Aber als ich versuchte, die Tabellen zu analysieren, kam der Fehler heraus.

CREATE OR REPLACE PROCEDURE ANALYZE_TABLE 
    AS 
     CURSOR table_cur IS 
      SELECT TABLE_NAME 
      FROM ALL_TABLES 
      WHERE TABLE_NAME LIKE 'STUDENT%'; 

     table_nm table_cur%ROWTYPE; 
     TYPE table_nms IS TABLE OF table_nm%TYPE; 
     l_table table_nms; 
    BEGIN 
     OPEN table_cur; 
     FETCH table_cur BULK COLLECT INTO l_table; 
     CLOSE table_cur; 

     FOR indx IN 1..l_table.COUNT LOOP 
      IF (indx.table_name = 'STUDENT_DETAILS') THEN 
     dbms_stats.gather_table_stats(ownname => 'ADMIN', tabname => indx.table_name , estimate_percent => 100, 
     method_opt => 'for all indexed columns size auto', 
     degree => 4 ,cascade => TRUE); 
      ELSIF (indx.table_name = 'STUDENT_ALLOWANCE' OR indx.table_name = 'STUDENT_PAYMENT') 
      THEN 
      DBMS_STATS.GATHER_TABLE_STATS (ownname => 'ADMIN', tabname => indx.table_name , estimate_percent => 100, 
     method_opt => 'for all indexed columns size auto', 
     degree => 4 ,cascade => TRUE); 
      ELSE 
      DBMS_STATS.GATHER_TABLE_STATS (ownname => 'ADMIN', tabname => indx.table_name , estimate_percent => 100, 
     method_opt => 'for all indexed columns size auto', 
     degree => 4 ,cascade => TRUE); 
      END IF; 
      --DBMS_OUTPUT.PUT_LINE(l_table(indx).TABLE_NAME); 
     END LOOP; 
    END ANALYZE_TABLE; 

Irgendwelche Vorschläge? Oder eine bessere Möglichkeit, Tabellen mit dieser Schleife zu analysieren? Vielen Dank im Voraus für jeden, der mir hilft. :)

Antwort

1

Sie müssen auf den Inhalt Ihres Arrays verweisen, nicht auf den Schleifenindex. Der Schleifenindex sagt Ihnen, welches Element im Array ist. Also:

IF (l_table(indx).table_name = 'STUDENT_DETAILS') THEN 

und so weiter

+0

Sehr ähnliche Antwort in der exakt gleichen Moment. – Rene

+0

@Rene - tolle Köpfe und all das :) – APC

+0

Wah danke so viel, btw ist es möglich, wenn ich die Analysetabellen parallel machen möchte? so können sie zusammen analysiert werden, keine Notwendigkeit zu warten, bis der andere Tisch analysiert ist. Danke – octoberafternoon

0

Sie sollten die Werte in der Tabelle beziehen sich wie folgt:

if (l_table(indx).table_name = 'STUDENT_DETAILS') ... 
+0

vielen Dank: D – octoberafternoon