Datenbanken

Datenbanken

Posts 1-6 of 6
  • Sven Rau
    Sven Rau
    The company name is only visible to registered members.
    stored procedure mehrere Rückgabewerte
    Hallo,

    ich beschäftige mit seit kurem mit stored procedures. Jetzt habe ich eine procedure geschrieben die über ein SELECT Daten zurückgeben soll. Dazu habe ich einen Output-Parameter gesetzt.
    Die Auswertung des SELECT-Befehls ergibt immer mehere Datensätz. Wie kann ich jetzt die Datensätze in den Output-Parameter bekommen.
    Im Moment zeigt mir der Output-Parameter immer nur einen Datensatz an. Muss ich das über ein Schleife lösen?

    Google hat mir da auch nicht wirklich weiter geholfen.
    Bin für jede Anregung dankbar.

    Gruß

    Sven

    CREATE PROCEDURE [dbo].[sp_getTransport_time]
    (
    @lieferant integer,
    @landkz integer,
    @gebiet integer,
    @zeitraum nchar(20) OUTPUT
    )
    AS
    declare @zeitid integer

    BEGIN

    SELECT @zeitid = zeitid FROM tblLiefergebiet WHERE lieferantenid = @lieferant AND landid = @landkz AND gebiet = @gebiet;
    SELECT @zeitraum = zeitraum FROM tblTransportzeit WHERE zeitraumid = @zeitid;
    SELECT (@zeitraum) AS WERT;

    END
  • Christoph Ingenhaag
    Christoph Ingenhaag    Premium Member
    The company name is only visible to registered members.
    Re: stored procedure mehrere Rückgabewerte
    Hallo Sven,

    ich gehe mal davon aus, das MS SQL Server als Datenbanksystem hast...

    mit OUTPUT gibst du den Inhalt der so definierten Variable an den Aufrufer zurück.
    Ansonsten gibt wird jedes mit einem SELECT erzeugtes Resultset an den Aufrufer zurückgegeben.
    Wenn du Variablen mit einem SELECT Statement füllst, wird nur der letzte in diese Variable geschriebene Wert zurückgegen (sofern OUTPUT)

    Felder als Variabeln zurückzugeben macht nur dann Sinn, wenn du nur einen Datensatz zurückgibst, da das Füllen und zurückgeben der Variablen weniger Overhead hat, als ein Resultset mit einem Datensatz zu füllen.
    Der Aufrufer muss dann den Wert der OUTPUT Variablen eigenen Variabeln zuweisen.

    Deine beiden Select Statements verknüpft man zu einem Statement mittels JOIN:

    select t.zeitraum
    from tblLiefergebiet l
    inner join tblTransportzeit t
    on
    l.zeitid = t.zeitraumid
    where
    l.lieferantenid = @lieferant and
    l.landid = @landkz AND
    l.gebiet = @gebiet


    GANZ WICHTIG: Benenne Datenbankobjekte wie z.B. Prozeduren NIEMALS mit den Präfix sp_ !!!!
    Objekte die so benannt sind werden vom SQL Server immer zuerst in der Master Datenbank gesucht und dann erst in der verbundenen Datenbank. Dies hat Auswirkungen auf die Performance und kann zu Namenskonflikten führen!

    Als Optionen solltest du weiterhin
    set nocount on --unterdrückt die Ausgabe der Anzahl der betroffenen Datensätze
    set xact_abort on -- Wichtig für Fehlerbehandlung von Transaktionen
    setzen
    und am Ende der Prozedur
    mit return einen Wert zurückgeben, der 0 zurückgibt wenn keine Fehler auftritt, und ungleich 0 wenn ein Fehler auftritt.
    Zur Fehlerbehandlung schau dir mal BEGIN TRY END TRY BEGIN CATCH END CATCH an.

    Das wärs erstmal im Groben...

    Als Newsgroup sehr zu empfehlen: microsoft.public.de.sqlserver

    Viele Grüße
    Christoph
  • Lukas Gradl
    Lukas Gradl
    The company name is only visible to registered members.
    Re: stored procedure mehrere Rückgabewerte
    Hallo Sven!

    Interessant wäre als erstes was du überhaupt für eine Datenbank anwendest.

    In FirebirdSQL z.B. müsste eine Stored procedure so aussehen:

    CREATE PROCEDURE DemoListe
    RETURNS (
    Nummer INTEGER,
    Text VARCHAR(25)
    ) AS
    BEGIN
    FOR SELECT Nr, Name FROM DemoTabelle WHERE DemoFlag=1 INTO :Nummer,:Text
    DO SUSPEND;
    END


    Das entscheidende ist hier das SUSPEND - du musst also eine Procedure schreiben, die in einer Schleife die ganzen Werte ausliest und sie dann mittels SUSPEND eine nach dem anderen hergibt.

    Gruß
    Luggi
  • Christoph Ingenhaag
    Christoph Ingenhaag    Premium Member
    The company name is only visible to registered members.
    Re^2: stored procedure mehrere Rückgabewerte
    Hallo Luggi

    Interessant wäre als erstes was du überhaupt für eine Datenbank anwendest.
     

    [dbo].[sp_getTransport_time]

    das hier sieht sehr nach MS SQL Server aus. Aber das verwendete Datenbanksystem dazu zu schreiben, ist schon sinnvoll ;-)

    Viele Grüße
    Christoph
  • Lukas Gradl
    Lukas Gradl
    The company name is only visible to registered members.
    Re^3: stored procedure mehrere Rückgabewerte
    Hmmm - den Verdacht hatte ich ja schon.

    Hier ist aber eine 100% Microsoft-Free Zone - da es MS-SQL für Linux immer noch nicht gibt (warum eigentlich nicht - endlich ein stabiles OS für die Datenbank *breitgrins*) sind meine Kentnisse für MS SQL sehr begrenzt...

    Gruß
    Luggi
  • Sven Rau
    Sven Rau
    The company name is only visible to registered members.
    Re^2: stored procedure mehrere Rückgabewerte
    Hallo Christoph,

    sorry, hätte natürlich dabei schreiben müssen, dass es sich um einen MSSQL-Server handelt.
    Vielen Dank schonmal für die Anregung.
    Werde ich ausprobieren.

    Gruß

    Sven
    This post was modified on 06 Feb 2010 at 01:26 pm.