Brunswick Geschrieben 14. Januar 2004 Teilen Geschrieben 14. Januar 2004 Ich möchte die durchschnittliche Satzlänge innerhalb verschiedener Tabellen anhand eines L/SQL Skripts ermitteln. Als Eingabeparameter kommen der Owner der Tabelle sowie der Tabellenname selber ins Skript. Habe mein Skript in nem Entwicklungstool geschrieben und dort lief es auch, allerdings muß es produktiv werden und dort SQL*PLUS konform laufen, was es aber anscheinend nicht tut. Leider weiß ich allerdings nicht mehr weiter, mein Skript liest sich bislang wie folgt: ACCEPT p_owner CHAR PROMPT 'Owner: '; ACCEPT p_table CHAR PROMPT 'Table: '; DECLARE cursor c1 is SELECT column FROM tabelle WHERE owner = '&&p_owner' AND table = '&&p_table' total_bytes NUMBER := 0; column_bytes NUMBER := 0; BEGIN FOR r_c1 in c1 LOOP SELECT round(avg(nvl(vsize(r_c1.column),0)+1)) INTO column_bytes FROM &&p_owner.&&p_table; total_bytes := total_bytes + column_bytes; END LOOP; dbms_output.put_line(total_bytes); EXCEPTION WHEN OTHRS THEN dbms_output.put_line(sqlerrm); END; Habs schon versucht umzubauen, indem ich mir den Select in der Schleife zusammensetze als String und dann den String mit execute absende, aber das bringt auch nichts, da er in der Stringkonkatanierung die Parameter nicht erkennen will. Weiterhin kann ich im SQL*Plus keine Werte für meine Parameter angeben bzw nur einen Wert für p_table, p_owner setzt er direkt automatisch auf blank Laufen muß das ganze unter SQL*Plus Version 9.2.0.1.0, die DB ist noch eine Oracle 8.1.6 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
OracleFan Geschrieben 15. Januar 2004 Teilen Geschrieben 15. Januar 2004 Hi Brunswick, da waren ja einige Fehler enthalten. Ich habe es nun mal so angepasst das es läuft. Dabei verwendet es die tabelle ALL_TAB_COLUMNS. In Zukunft solltest du nicht so entwickeln das du eine PL/SQL Prozedur schriebst, denn diese ist so nicht möglich in SQL*PLUS. In Komentaren siehst du die Änderungen: ACCEPT p_owner CHAR PROMPT 'Owner: '; ACCEPT p_table CHAR PROMPT 'Table: '; DECLARE total_bytes NUMBER := 0; column_bytes NUMBER := 0; BEGIN FOR r_c1 in (SELECT column_name FROM ALL_TAB_COLUMNS WHERE owner = '&&p_owner' AND table_name = '&&p_table') // Cursor in Forschleife gesetz, Andere Tabelle verwendet LOOP SELECT round(avg(nvl(vsize(r_c1.column_name),0)+1)) INTO column_bytes FROM &&p_owner..&&p_table; // es mußten zwei . zwischen die Variablen damit er es richtig interpretiert total_bytes := total_bytes + column_bytes; END LOOP; dbms_output.put_line(total_bytes); END; / 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.