Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

PL/SQL Skript hat Fehler

Empfohlene Antworten

Veröffentlicht

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

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;

/

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.