Führen Sie Für Jede Tabelle in PLSQL
Möchte ich die Anzahl der Datensätze in allen Tabellen mit einem bestimmten Namen Kriterien. Hier ist die SQL, die ich gebaut
Declare SQLStatement VARCHAR (8000) :='';
BEGIN
SELECT 'SELECT COUNT (*) FROM ' || Table_Name || ';'
INTO SQLStatement
FROM All_Tables
WHERE 1=1
AND UPPER (Table_Name) LIKE UPPER ('MSRS%');
IF SQLStatement <> '' THEN
EXECUTE IMMEDIATE SQLStatement;
END IF;
END;
/
Aber ich bekomme die folgende Fehlermeldung:
Error at line 1
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 3
Script Terminated on line 1.
Wie kann ich ändern, damit es läuft für alle passenden Tabellen?
Update:
Basierend auf eine Antwort erhielt, ich habe Folgendes versucht, aber ich bekomme nicht alles in den DBMS_OUTPUT
declare
cnt number;
begin
for r in (select table_name from all_tables) loop
dbms_output.put_line('select count(*) from CDR.' || r.table_name);
end loop;
end;
/
Stellen Sie sicher, dass Sie nicht haben Semikolon am Ende der Anweisung dynamic. Execute immediate einen Fehler zurück, wenn Sie es haben.
Haben Sie DBMS-Ausgang aktiviert? Vielleicht müssen Sie zuerst tun, um zu sehen, Ihren Ausgang.
Haben Sie DBMS-Ausgang aktiviert? Vielleicht müssen Sie zuerst tun, um zu sehen, Ihren Ausgang.
InformationsquelleAutor Raj More | 2011-02-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die Auswahl von
all_tables
Sie können nicht darauf zählen, für die Zuschüsse notwendig wählen Sie aus der Tabelle Namen. Prüfen Sie daher, für dieORA-00942: table or view does not exist
Fehler geworfen.Als die Ursache für Ihre Fehler: Sie erhalten diese Fehlermeldung, da die select-Anweisung gibt ein ResultSet mit mehr als eine Zeile (einen für jede Tabelle) und kann Sie nicht zuordnen, ein solches Ergebnis gesetzt, um ein varchar2.
Durch die Art und Weise, stellen Sie sicher, dass Sie aktivieren dbms_output mit
SET SERVEROUT ON
vor der Ausführung dieses Blocks.Diese Lösung ignoriert die Möglichkeit, dass zwei vorhandenen Tabellen mit dem gleichen Namen, aber unterschiedliche Besitzer.
Hoffe du verzeihst mir meine edits 🙂
Jeffrey: keine Sorge, die änderungen werden geschätzt. Danke für die Verbesserung meiner Antwort.
InformationsquelleAutor René Nyffenegger