Forum


Ansicht von 8 Beiträgen - 1 bis 8 (von insgesamt 8)
  • Autor
    Beiträge
  • #108490
    metleck
    Teilnehmer

    Hi!
    Hat vielleicht jemand einen Tipp für ein Forum in dem man Fragen zu SQL PL/SQL… stellen kann?
    Ich find leider keins im Internet
    Danke

    #116194
    Angela
    Moderator

    Das kommt auf Deine Fragen an. 😉
    Leider habe ich keine Zeit mit Dir hier ein geführtes SQL – PL/SQL Tutorium zu veranstalten. Ich kann Dir aber gerne die eine oder andere kleine Frage hier beantworten.

    Ein Forum, das sich ausschließlich mit diesen themengebieten beschäftigt, kenn ich leider auch nicht.

    #116196
    metleck
    Teilnehmer

    🙂 ok.
    Ich war mir auch mnicht sicher ob ich hier sowas fragen kann, deshalb such ich halt ein Forum.
    Also ich versteh nicht genau den Sinn von Packages. Ich verstehe ungefähr wie man sie erstellt aber weiß nicht warum, wieso, weshalb…?
    Wenn du mir das sagen könntest wäre das echt gut!
    In dem Zusammenhang vielleicht auch Prozeduren?!Ist wahrschienlich zuviel.

    #116193
    Angela
    Moderator

    Da kommt’s jetzt drauf an, wie viel Erfahrung Du generell mit Programmierung hast.

    PL/SQL ist im Prinzip eine strukturierte Programmiersprache, d.h. es gibt die Möglichkeit einzelne Abläufe in sogenannte Prozeduren auszulagern, die dann immer wieder aufgerufen werden können. Diesen Prozeduren kann ich mittels Parametern Werte übergeben und sie können Werte zurückgeben.

    Eine Besonderheit von PL/SQL ist eben diese Handhabung von Übergabe- und Rückgabewerten. In PL/SQL kann ich die Parameter einer Prozedur als
    – IN (reine Eingabewerte)
    – OUT (reine Rückgabewerte)
    – IN OUT (sowohl Ein- als auch Ausgabewert)
    kennzeichnen.

    Beim Aufruf der Prozedur müssen aber in jedem Fall alle Parameter mit übergeben werden (auch reine OUT Parameter!). Der Unterschied ergibt sich hauptsächlich in der aufrufenden Prozedur. Übergebe ich von dort eine Variable als IN Parameter, bleibt sie in der aufrufenden Prozedur auf jeden Fall unverändert, übergebe ich sie als OUT oder IN OUT Parameter kann sie von der aufgerufenen Prozedur verändert werden.
    Erhält eine Prozedur einen reinen IN Parameter, kann der Wert dieses Parameters nicht verändert werden!

    Ein Beispiel:
    CREATE OR REPLACE PROCEDURE test1
    (iPara1 IN INTEGER,
    oPara2 OUT INTEGER) IS
    BEGIN
    oPara2 := iPara1 + 5;
    END test1;

    CREATE OR REPLACE PROCEDURE test2 () IS
    tmpVariable1 INTEGER;
    tmpVariable2 INTEGER;
    BEGIN
    tmpVariable1 := 3;
    tmpVariable2 := 0;
    test1(tmpVariable1, tmpVariable2); //Prozeduraufruf
    END test2;

    Aus der Prozedur test2 wird die Prozedur test1 aufgerufen. Dabei werden beide in test1 definierten Parameter mit übergeben.
    Der IN Parameter kann dort nicht verändert werden, wohl aber der OUT Parameter.
    Beim Start von test1 ist der Wert von iPara1 = 3, der Wert von iPara2 = 0. Anschließend wird die Anweiung ausgeführt. Danach ist iPara1 nach wie vor = 3, iPara2 aber ist = 8. Ein explizites Beenden der Prozedur, z.B. über die Anweisung RETURN, ist nicht nötig. Ist die Prozedur vollständig abgearbeitet, kehrt die Verarbeitung in die aufrufende Prozedur zurück, hier also zu test 2.
    In der Prozedur test2 werden die beiden Variablen am Anfang auf Initialwerte gesetzt, tmpVariable1 = 3, tmpVariable2 = 0. Danach folgt der Prozeduraufruf.
    Nach dem Prozeduraufruf ist tmpVariable1 nach wie vor = 3, tmpVariable2 hat aber den neuen Wert = 8 von test1 zurückerhalten.

    Verständlich?

    #116192
    Angela
    Moderator

    Und Packages sind in PL/SQL, ähnlich wie in Java, in erster Linie ein Ordnungsinstrument.

    Soll heißen, sie bieten mir die Möglichkeit, mehrere zusammengehörige Elemente in einem Element zusammenzufassen.
    Gibt es z.B. eine bestimmte Verarbeitung auf der Datenbank, die aus 10 verschiedenen Prozeduren besteht, die sich gegenseitig aufrufen, verliert man leicht den Überblick, was zusammengehört.
    Also fasst man diese 10 Prozeduren in einem Package zusammen, dadurch wird sofort erkennbar – aha, die gehören zusammen zu einem bestimmten Ablauf.

    Ein Package in PL/SQL besteht aus einem Head und einem Body.
    Im Head des Packages werden alle Elemente definiert, die von außen, also z.B. aus einem anderen Package oder einer anderen Prozedur, aufgerufen werden sollen. Also ähnlich wie ein als public definiertes Element in einer objektorientierten Programmiersprache.
    Lediglich definiert bedeutet, es wird nur der Kopf der Prozedur angegeben, aber kein Source.
    Im Body werden dann die im Head definierten Prozeduren ausprogrammiert, d.h. mit Source versehen. Dabei muss jede Prozedur, die im Head definiert ist, im Body ausprogrammiert werden (sonst lässt sich das Package nicht kompilieren). Zusätzlich kann ich im Body aber weitere Prozeduren, Variablen etc. programmieren. Diese sind dann von außen nicht aufrufbar. Vergleichbar mit private in einer objektorientierten Programmiersprache.

    Beispiel:
    //Head
    CREATE OR REPLACE PACKAGE test IS
    //hier wird nun eine Prozedur definiert
    PROCEDURE packageTest1 (oReturn OUT INTEGER);
    END test; //Ende des Head

    //Body
    CREATE OR REPLACE PACKAGE BODY test IS
    //Deklaration einer Variablen, diese ist von außen nicht sichtbar,
    //gilt aber im gesamten Package test
    tmpPackageVariable INTEGER;
    //die im Head definierte Prozedur muss ausprogrammiert werden
    PROCEDURE packageTest1 (oReturn OUT INTEGER) IS
    BEGIN
    oReturn := 0;
    END packageTest1;
    //zusätzlich können noch weitere Prozeduren definiert werden;
    //diese sind dann von außen nicht aufrufbar
    PROCEDURE internePackageProzedur () IS
    BEGIN
    tmpPackageVariable := 5;
    END internePackageProzedur;
    END test; //Ende des Package Bodys

    #116195
    metleck
    Teilnehmer

    Das heißt also in Prozeduren enthalten genau dieselben Teil (deklaratiosnteil…) wie blöcke, man könnte z.b. ein prozedur schreiben , die was berechnet und wenn z.b. der Wert 3 da rauskommt soll die nächste Prozedur „abgespielt“ werden´?!

    #116191
    Angela
    Moderator

    Nunja, ich weiß nicht genau, was Du unter einem „Block“ verstehst (manche bezeichnen jedes PL/SQL Element als Block), ich gehe davon aus dass Du eine quasi „unbenannte“ Folge von Anweisungen in PL/SQL meinst (fängt an mit „DECLARE“).

    Eine Prozedur aber ist ein selbstständiges, benanntes Element in einer Oracle Datenbank, das aus anderen Prozeduren mittels seines Namens aufgerufen werden kann und z.B. eine Berechnung durchführt. Vorteil ist, dass es unter dem Prozedurnamen in der Datenbank gespeichert ist und immer wieder verwendet werden kann.

    Sagt Dir der Begriff „strukturierte Programmierung“ (auch: modulare oder prozedurale Programmierung) denn was?
    Das ist nämlich genau das Prinzip, das dahintersteckt.

    #116197
    Dani
    Teilnehmer

    Hallo metleck

    Falls du dann doch weitere Fragen hast, habe ich hier dann noch ein Link für dich:

    http://forum.2lucky.de/

    Mfg Dani

Ansicht von 8 Beiträgen - 1 bis 8 (von insgesamt 8)
  • Das Forum „Tipps und Tricks“ ist für neue Themen und Antworten geschlossen.
Momentan aktive Benutzer: 0
No users are currently active
Aktive Benutzer in den letzten 24 Stunden: 0
Keymaster | Moderator | Participant | Spectator | Blocked
Additional Forum Statistics
Threads: 1.488, Posts: 22.646, Members: 11.010
Welcome to our newest member, lonnielunceford
Most users ever online was 5 on 16. September 2020 22:11