2016-10-12 2 views
0

Je boucle pour toutes les tables dans db:tables en boucle pl/sql et le numéro d'affichage des lignes

declare 
    V_TABL_NM ALL_TABLES.TABLE_NAME%TYPE; 
BEGIN 
    FOR GET_TABL_LIST IN (SELECT TABLE_NAME FROM ALL_TABLES)LOOP 
     V_TABL_NM := GET_TABL_LIST.TABLE_NAME; 
     DBMS_OUTPUT.PUT_LINE(V_TABL_NM); 
    END LOOP; 
END; 

Comment puis-je trier mes résultats et ajouter nombre d'enregistrements pour chaque table? J'essaie ci-dessous, mais il ne fonctionne pas:

declare 
    V_TABL_NM ALL_TABLES.TABLE_NAME%TYPE; 

    table_row number; 

BEGIN 
    FOR GET_TABL_LIST IN (SELECT TABLE_NAME FROM ALL_TABLES)LOOP 
     V_TABL_NM := GET_TABL_LIST.TABLE_NAME; 

     table_row: = select count(*) from TABLE_NAME; 

     DBMS_OUTPUT.PUT_LINE(V_TABL_NM, table_row); 
    END LOOP; 
END; 
+0

Il est toujours préférable d'utiliser PROPRIÉTAIRE tout en obtenant le nombre de la table si vous utilisez ALL_TABLES. Aussi, si les statistiques sont fraîches alors vous pouvez obtenir le nombre d'enregistrements de la colonne NUM_ROWS dans ALL_TABLES – hemalp108

+0

Avez-vous besoin des chiffres exacts ou une valeur approximative? Si vous avez des tables significativement grandes, le script pourrait prendre beaucoup de temps à s'exécuter, ce qui pourrait être considérablement réduit si vous utilisez une clause 'sample'. –

Répondre

2

Vous ne pouvez pas faire une requête de cette façon; TABLE_NAME n'a aucun sens ici (et il vous manque d'utiliser le nom du curseur), vous devez donc créer un SQL dynamique et l'exécuter pour mettre la valeur dans une variable. En outre, le PUT_LINE n'accepte pas ces paramètres. Cela devrait fonctionner:

DECLARE 
    table_row        NUMBER; 
BEGIN 
    FOR GET_TABL_LIST IN ( SELECT OWNER || '.' || TABLE_NAME AS TABLE_NAME 
           FROM ALL_TABLES 
          ORDER BY TABLE_NAME) 
    LOOP 
     EXECUTE IMMEDIATE 'select count(*) from ' || GET_TABL_LIST.TABLE_NAME INTO table_row; 

     DBMS_OUTPUT.PUT_LINE(GET_TABL_LIST.TABLE_NAME || ' - ' || table_row); 
    END LOOP; 
END; 

A propos de la commande, il suffit d'ajouter un ORDER BY à la requête en boucle à travers les tables

Cela suppose que vous avez le droit de demander à toutes les tables répertoriées dans ALL_TABLES Si vous devez simplement interroger toutes les tables de votre schéma, utilisez USER_TABLES au lieu de ALL_TABLES.

+0

Im obtenir erreur: table ou vue n'existe pas en ligne: execute .... Voir – 4est

+0

Cela signifie que votre utilisateur ne peut pas interroger toutes les tables résultant de la requête; êtes-vous sûr que vous avez besoin all_tables et non USER_TABLES? Si le problème est l'absence de synonymes, essayez d'utiliser le même champ propriétaire et requête non TABLE_NAME mais propriétaire.nom_table – Aleksej

+0

mais ma première requête fonctionne (je peux boucle toutes les tables) – 4est

0

pour trier les résultats ajouter order by Clausel:

FOR GET_TABL_LIST IN 
(
    SELECT TABLE_NAME 
    FROM ALL_TABLES 
    ORDER BY TABLE_NAME -- 
)LOOP 

compter les enregistrements utilisent SQL dynamique:

execute immediate 'select count(*) from ' || V_TABL_NM INTO table_row; 
0

Cela peut se faire complètement sans PL/SQL:

select table_name, 
     to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from '||table_name)),'/ROWSET/ROW/C')) as rowcount 
from user_tables 
order by rowcount; 
+0

ALL_TABLES Je suis erreur: erreur ORA-19202 a eu lieu dans le traitement xml ... – 4est

+0

@ 4EST: la version Oracle utilisez-vous. Cela fonctionne très bien pour moi avec Oracle 12 et Oracle 11 –

+0

Oracle Database 11g version 11.2.0.4.0 - 64 bits de production, mais probablement il ne contient pas tout le paquet, tout pourquoi je vais enregistrer votre code – 4est

0

aussi j'ai fait:

select TABLE_NAME, NUM_ROWS, LAST_ANALYZED 
from user_tables 
order by 1;