RomyWinfo Geschrieben 23. Januar 2009 Teilen Geschrieben 23. Januar 2009 Frage: Schreiben Sie eine stored procedure, die bei Eingabe eines Tabellennamens die Anzahl der Sätze, die aktuell in dieser Tabelle sich befinden, ausgibt. Kann man das so machen? CREATE PROCEDURE table_count ( in_table_name IN VARCHAR2, out_anzahl OUT NUMBER ) AS v_tablename VARCHAR2 := in_table_name; BEGIN SELECT COUNT (*) INTO out_anzahl FROM v_tablename; END; EXCEPTION WHEN NO_DATA_FOUND THEN out_anzahl:=0; END; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20010,’proc’||’table_count: ‘|| substr(SQLERRM,1,80)); END; Danke vorab! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 23. Januar 2009 Teilen Geschrieben 23. Januar 2009 Hi, nicht ganz. Zuerst müsste man wissen wohin das Ergebnis ausgegeben werden soll. Bei einem SELECT count() wird nie eine NO_DATA_FOUND Exception gefunden. Bei 0 Sätzen wird einfach 0 geliefert. Den entsprechenden Exceptionteil kannst also weglassen. Dann kann man kein statisches SQL machen, bei dem der tabellenname nicht fest ist. Hier braucht man dynamisches SQL: EXECUTE IMMEDIATE' select count(*) from '||in_table_name INTO out_anzahl; Weswegen scheidest Du denn die Fehlermeldung auf 80 Zeichen ab? Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RomyWinfo Geschrieben 23. Januar 2009 Autor Teilen Geschrieben 23. Januar 2009 Danke für die Antwort, mein Problem ich kenne mich mit stored procedures gar nicht aus... kann ich dann den AS Teil ganz weglassen? CREATE PROCEDURE table_count ( in_table_name IN VARCHAR2, out_anzahl OUT NUMBER ) AS v_tablename VARCHAR2 := in_table_name; BEGIN EXECUTE IMMEDIATE' select count(*) from '||in_table_name INTO out_anzahl; END; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20010,’proc’||’table_count: ‘|| substr(SQLERRM,1,80)); END; Danke schon mal.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 23. Januar 2009 Teilen Geschrieben 23. Januar 2009 Weglassen? Nein nur ersetzen: CREATE PROCEDURE table_count ( in_table_name IN VARCHAR2, out_anzahl OUT NUMBER) AS BEGIN EXECUTE IMMEDIATE 'select count(*) from '||in_table_name INTO out_anzahl; END; Des weiteren sind das ' und keine Backticks (’) wie du sie verwendet hast. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.