Zum Inhalt springen

PL/SQL Skript hat Fehler


Brunswick

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

/

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...