Announcement

Collapse
No announcement yet.

Stored Procedure mit einem Parameter übergeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stored Procedure mit einem Parameter übergeben

    Moin!

    Also, ich hab folgendes Problem... Eine Klasse über uns haben Sie am Mittwoch eine SQL-Klausur geschrieben und voraussichtlich schreiben wir die Gleiche Klausur am Montag auch - war zumindest beim letzten Mal auch so. Jetzt haben wir zwar die Aufgaben, aber leider keine Lösung dazu, weil Sie irgendwie keiner konnte!

    Es geht genauer gesagt um eine Stored Procedure mit einem Parameter der in die SP übergeben werden muss. Die genaue Aufgabe war, dass wir eine Währung, also ein Betrag, als Parameter mit in die SP übernehmen sollen, diese dann in der SP mit einem anderen Wert (auch Währung) multipliziert wird. Weis da wer Rat wie diese aussehen müsste?

    Hoffe meine Frage war klar

    Gruß

  • #2
    create procedure sp_waehrung (
    BETRAG numeric (15,2),
    KURS numeric (9,4)
    )
    RETURNS ( BETRAG_IN_WAHERUNG numeric (15,2) )
    AS
    BEGIN
    if ( KURS =< 0.00 ) THEN BETRAG_IN_WAEHRUNG = 0;
    else BETRAG_IN_WAHERUNG = BETRAG / KURS;
    END

    Diese Prozedur wird mit EXECUTE PROCEDURE SP_WAEHRUNG ( 100, 1.23 ) ausgeführt.

    Luc.

    P.S.:
    Währungsumrechnungen erfolgen seit der Einführung des Euro nicht über Multiplikation, sondern über Division. (Bsp.: 1 USD = 1.25 Euro --> 100 USD sind nicht 125 Euro sondern 80 Euro

    Comment


    • #3
      Besten Dank schonmal!

      Meinte es allerdings so, dass in einer Tabelle mehrere Daten enthalten sind uns dann dort die einzelnen Beträge nehmen und diese dann mit dem neuen Wert multi bzw. div...

      Danke und Gru&#223

      Comment


      • #4
        Wenn Du die Aufgabe etwas konkretisierst, wird es auch veständlicher, ganz habe ich es immer noch kapiert.

        Aber wenn Du für jeden Datensatz einer bestimmten Tabelle die Umrechnung haben willst, geht es so:

        create procedure sel_waehrung (
        KURS numeric (9,4)
        )
        RETURNS ( BETRAG_IN_WAHERUNG numeric (15,2) )
        AS
        DECLARE VARIABLE BETRAG NUMERIC(15,2);
        BEGIN
        FOR SELECT <BETRAGSFELD> FROM TABELLE
        INTO :BETRAG
        DO BEGIN
        if ( KURS =< 0.00 ) THEN BETRAG_IN_WAEHRUNG = 0;
        else BETRAG_IN_WAHERUNG = BETRAG / KURS;
        SUSPEND; /* SATZ RAUSSCHREIBEN */
        END
        END

        Diese Prozedur ist jetzt eine SELECTABLE Procedure (also eine Query oder einen Cursor zum abfragen verwenden!) und im SQL eintragen:

        SELECT * FROM SEL_WAEHRUNG ( :KURS )

        Luc

        Comment


        • #5
          jep, genau sowas meinte ich!!! sorry, aber bin nunmal kein sql crack, dass ich es genau erklären kann, welche SP es genau sein muss...

          nur nochmal zum verständnis, ich habe in eine tabelle gegeben, in der verschiedene beträge eingetragen sind. um sie jetzt komplett in einen anderen kurs zu ändern, bräuchte ich halt die SP, in der ich mit einem parameter den kurs selbst bestimmen kann.
          aber genau sowas wie du meinte ich, hab mich heute nachmittag auch noch hingesetzt und das hier programmiert... allerdings sagt er mir "Column unknown"...
          <br>
          set term^;
          create procedure waehrung
          (kurs numeric(9,4))
          returns (wert numeric(9,2))
          as
          begin
          select »Spaltenname« from »Tabelle«
          into :wert;
          begin
          wert= »Tabelle.Spalte« / kurs;
          insert into »Tabelle«
          (
          »Spalte«
          )
          Values (:wert);
          end
          suspend;
          end ^
          set term;

          Comment


          • #6
            Wenn Du ein SELECT INTO machst, werden die Werte aus der Tabelle in die angegebenen Parameter reingeschrieben.
            Du kannst NICHT auf Tabelle.Spalte direkt zugreifen, aber dafür hast Du ja die Variable WERT definiert, die jeweils den Wert des aktuellen Datensatzes enthält.
            Wenn Du in der Procedure ein INSERT INTO machst, ist das SUSPEND wiederum Nonsense, da ein suspend bedeutet, SCHREIBE DEN DATENSATZ raus (d.h. so etwas verwendet man, wenn Stored Procedures dazu verwendet werden, komplexe SQL-Abfragen zu erstellen, die mit Standard SQL nicht so ohne weiteres erledigt werden können).
            Wenn Du mit Deinem SQL-Statement mehr als einen Datensatz aus einer Tabelle ausliest, funktioniert Dein o.a. Select auch nicht, da es zu dem Fehler MULTIPLE ROWS IN SINGLETON SELECT führt. Bei mehreren Sätzen musst Du IMMER mit FOR SELECT .. DO BEGIN .. END arbeiten.
            (Außerdem verstehe ich nicht ganz, warum Du die Datensätze wieder in die gleiche Tabelle einfügen möchtest...)
            Luc

            Comment


            • #7
              Ich möchte doch die Werte ersetzen, deshalb ja wieder rein damit. Könntest du es dann korrigieren

              Comment


              • #8
                Wozu dann eine StoredProcedure?
                Ein einfaches UPDATE Statement reicht doch auch ;-)

                set term^;
                create procedure waehrung
                returns (wert )
                as
                declare variable wert numeric(9,2);
                declare variable ID INTEGER;
                begin
                FOR SELECT PRIMARY_KEY_FELD, WERTSPALTE
                FROM TABELLE
                INTO :ID, :WERT
                DO BEGIN
                UPDATE TABELLE SET
                WERTSPALTE = WERT * KURS
                WHERE PRIMARY_KEY_FELD = :ID
                END
                END ^
                SET TERM ;^

                Luc

                Comment


                • #9
                  *gg* Stimmt ja alles schon, aber so will der Lehrer es in der Klausur haben ;-) Vielen Dank, du hast mir echt das Leben und viele Punkte gerettet!!

                  Bis dann und Danke nochmal!!

                  Gruß Ma

                  Comment


                  • #10
                    abgesehen davon, dass ich jetzt auch mit dem kurs multipliziert habe ;-)
                    Ach ja: DIese Prozedur sollte mit EXECUTE PROCEDURE ausgeführt werden, da es KEINE selectable procedure ist und der Header sollte:

                    set term^;
                    create procedure waehrung ( kurs numeric (9,4)
                    as
                    .....

                    sein.

                    ;-

                    Comment


                    • #11
                      Hey Luc!
                      Die Klausur lief wunderbar :-) Hab alle Aufgaben geschafft und die SP war wirklich die, die ich hier oben angefangen habe zu diskutieren.
                      Allerdings natürlich ohne ID, wir sollten nur das Feld multiplizieren, aber selbst auf ein paar Fehlern kommts nicht an.

                      Danke nochmal,
                      Gruß Ma

                      Comment

                      Working...
                      X