23. Januar 200916 j 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!
23. Januar 200916 j 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
23. Januar 200916 j 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....
23. Januar 200916 j 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
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.