Frage zu PL/SQL

hallo,

man hat mir folgendes über den tisch geworfen:

begin
ALTER ROLLBACK SEGMENT RBS01 OFFLINE;
exception
when others then null;
end;
/
begin
DROP ROLLBACK SEGMENT RBS01;
exception
when others then null;
end;
/
danach sollte das Rollbacksegment neu angelegt werden,

nur haben die beiden geschichten davor nicht geklappt, was ihr wahrscheinlich schon sofort gesehen habt.

die frage ist nun meinerseits wie hätte man das richtig geschrieben ?

ich bin zwar gerade dabei mir die schulungsunterlagen K1070 PL/SQL Datenprogrammierung Teil 1 reinzuladen, aber ich habe eben erst kapitel 1 beendet… :wink:

das wäre also für mein grundsätzliches verständnis sehr hilfreich

Grüße

chris

Hallo Chris!

Warum nicht einfach so:

WHENEVER SQLERROR EXIT 1 ROLLBACK;
WHENEVER OSERROR EXIT 1 ROLLBACK;
ALTER ROLLBACK SEGMENT RBS01 OFFLINE;
DROP ROLLBACK SEGMENT RBS01;
CREATE PUBLIC ROLLBACK SEGEMT RBS01 TABLESPACE XYZ;
...

Also einfach nix PL/SQL sondern ein reines SQL-Skript, das Du dann mit SQL*Plus ausführst. Wenn irgendetwas schiefgeht sollte man hier meiner Meinung nicht weitermachen. Ausnahme dazu ist eventuell wenn der ALTER…OFFLINE schiefgeht, der bringt nämlich auch einen Fehler, wenn das Segment schon OFFLINE ist. Du kannst auch den Fehlercode im WHENEVER für jedes Statement ändern, dann kann ein aufrufendes Batch-Skript auch feststellen, was denn nicht schiefgegangen ist (wenn ich mich richtig erinnere hast du einen Win-Server, dort geht’s mit IF ERRORLEVEL).

Oder habe ich da jetzt was falsch verstanden?

Gruß,
Martin

hallo,

man hat mir folgendes über den tisch geworfen:

begin
exception
when others then null;
end;
/
begin
exception
when others then null;
end;
/
danach sollte das Rollbacksegment neu angelegt werden,

nur haben die beiden geschichten davor nicht geklappt, was ihr
wahrscheinlich schon sofort gesehen habt.

die frage ist nun meinerseits wie hätte man das richtig
geschrieben ?

ich bin zwar gerade dabei mir die schulungsunterlagen K1070
PL/SQL Datenprogrammierung Teil 1 reinzuladen, aber ich habe
eben erst kapitel 1 beendet… :wink:

das wäre also für mein grundsätzliches verständnis sehr
hilfreich

Grüße

chris

Hallo Martin,

meine frage kam daher das ich das script so bekommen habe und ich hatte schon gesehen das das eigentlich so nicht läuft, mich hat jetzt halt nur interessiert wie man das mit pl/sql richtig vormuliert hätte.

wie du das machst, mit diesem WHENEVER, ist mir noch nie über den weg gelaufen, ich habe nur die orginal oracle schulungsunterlagen und da steht das nicht mit drin…

Grüße

Christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Chris,

meine frage kam daher das ich das script so bekommen habe und
ich hatte schon gesehen das das eigentlich so nicht läuft,
mich hat jetzt halt nur interessiert wie man das mit pl/sql
richtig vormuliert hätte.

Es geht natürlich auch mit PL/SQL, aber ich schreibe mir auch kein C-Programm, das einen „DIR“ macht…

Wenn’s denn unbedingt sein soll: Das Package deiner Wahl ist DBMS_SQL. Sieht dann in etwa so aus:

DECLARE my\_cursor INTEGER;
 my\_returnvalue INTEGER;
BEGIN
 my\_cursor := DBMS\_SQL.OPEN\_CURSOR;
 DBMS\_SQL.PARSE(my\_cursor, 'ALTER ROLLBACK SEGMENT...', DBMS\_SQL.NATIVE);
 my\_returnvalue := DBMS\_SQL.EXECUTE(my\_cursor);
END;

wie du das machst, mit diesem WHENEVER, ist mir noch nie über
den weg gelaufen, ich habe nur die orginal oracle
schulungsunterlagen und da steht das nicht mit drin…

WHENEVER ist ein Befehl von SQL*Plus und zumindest in der Doku von SQL*Plus sehr wohl erklärt (die gibt’s im Technet zum Download, wenn du sie nicht schon hast). Damit kannst du dem Ding sagen, was es bei einem Fehler tun soll (weitermachen, Programm beenden, dabei offene Transaktion abschliessen [commit] oder rückgängig machen [rollback]). Ist aber leider recht simpel gestrickt, du kannst also nicht bestimmte Fehler ignorieren und andere behandeln. Wenn du das machen willst brauchst du in der Tat einen PL/SQL Block (anonym oder als Prozedur, Funktion, Package,…).

Gruss
Martin

Hi,

Es geht natürlich auch mit PL/SQL, aber ich schreibe mir auch
kein C-Programm, das einen „DIR“ macht…
Wenn’s denn unbedingt sein soll: Das Package deiner Wahl ist
DBMS_SQL.

Naja, wenn du das so umständlich machen willst , dann hast du Recht. Ab Oracle 8i gibt es allerdings „execute immediate“, was das Ganze wesentlich verschlankt:

begin
 EXECUTE IMMEDIATE 'ALTER ROLLBACK SEGMENT...';
end;

Gruß

Sancho

genau sowas hatte ich gedacht…

begin


> EXECUTE IMMEDIATE 'ALTER ROLLBACK SEGMENT...';  
> end;

ich danke euch !

Grüße

Chris

kann mir noch jemand ein Buch empfehlen mit dem ich das gescheit lernen kann ?

Ich brauche sowas für blöde, wo ein Beispiel das nächste jagt und wo man genau erklärt bekommt was wofür an welcher stelle eingetragen wurde…

mit diesem trockenen Theoriegefasel das ich mir im Moment reindrücke kann ich nichts anfangen, da bleibt nichts hängen…

Servus!

Naja, wenn du das so umständlich machen willst , dann
hast du Recht. Ab Oracle 8i gibt es allerdings „execute
immediate“, was das Ganze wesentlich verschlankt:

begin
EXECUTE IMMEDIATE ‚ALTER ROLLBACK SEGMENT…‘;
end;

Gestern war wohl nicht mein Tag (ein Brett weiter oben musste ich auch schon die Schmach einer Korrektur hinnehmen :wink: ). Hast natürlich 100 %-ig recht…

Gruß
Martin