2016-04-13 20 views
0

Ich habe einige Zeit an Code gearbeitet, habe aber einige Probleme. Ich habe zwei identische Tabellen - History und Checked_Out_Media - und ich versuche, einen bestimmten Datensatz in Checked_Out_Media aufzunehmen und in die History-Tabelle zu verschieben. Die Primärschlüssel werden nicht automatisch inkrementiert, daher muss ich eine Variable für die maximale History-Tabellen-ID erstellen und sie um eins erhöhen.MySQL-Semikolon-Platzierung in Prozedur

Ich denke, ich habe den Code größtenteils korrekt, möglicherweise einige Simi-Colon-Platzierungen benötigt werden? Kannst du dir das mal ansehen?

Create Procedure spMoveToHistory(IN UserID char(6), IN MediaBarcode varchar(50)) 

BEGIN 

    SELECT @NextRow := (MAX(History_TUID) + 1) 
    From History 

    Insert into History 
    Values (@NextRow, COM.User_ID, COM.Media_Barcode, COM.Checked_Out_Date, COM.Return_Date) 
    From Checked_Out_Media as COM 
    Where COM.User_ID = UserID 
     AND (COM.Media_Barcode = MediaBarcode) 

END 

Außerdem bin ich mit phpMyAdmin, die mir das Trennzeichen festlegen können außerhalb des Codes //.

Vielen Dank im Voraus!

+0

Ihre SELECT- und INSERT-Anweisungen benötigen ein Semikolon am Ende. Siehe MySQL-Dokumente für die CREATE PROCEDURE-Anweisung. – miken32

+0

@ miken32 Ich schätze den Rat sehr. Ich werde es mir ansehen. Ich habe ziemlich viel Programmierung in SQL Server gemacht und ich versuche, MySQL in den Griff zu bekommen - es reißt mich innerlich auf. – FoxDonut

Antwort

1

Sie sollten die Parameter so benennen, dass sie von den Spaltennamen unterschieden werden können. Darüber hinaus wollen Sie insert . . . select:

Create Procedure spMoveToHistory (
    IN in_UserID char(6), 
    IN in_MediaBarcode varchar(50) 
) 
BEGIN 
    SELECT @NextRow := (MAX(History_TUID) + 1) 
    From History; 

    Insert into History 
     Select @NextRow, COM.User_ID, COM.Media_Barcode, COM.Checked_Out_Date, COM.Return_Date 
     From Checked_Out_Media COM 
     Where COM.User_ID = in_UserID AND COM.Media_Barcode = in_MediaBarcode; 
END; 
+0

Kann ich auch eine Löschanweisung hinzufügen, um die Zeile in der Checked_Out_Media-Tabelle zu löschen? Ist es möglich, eine andere Operation innerhalb derselben Prozedur auszuführen? Es war eine einfache Ergänzung in SQL Server, kann auch nicht funktionieren. – FoxDonut

+0

@Gordon_Linoff Der obige Code scheint nicht zu funktionieren. Nach der Erstellung ist ein Fehler aufgetreten. Der Code erstellt die Prozedur, führt dann beim Aufruf keine Aktion aus und zeigt unter END eine rote Unterstreichung. Irgendwelche Ideen? – FoxDonut

0

Hier ist der endgültige Code ich in der Lage war, um zu arbeiten. Aus irgendeinem Grund hat der Code, den Gordon angeboten hat, nichts getan. Es wurde nicht eingefügt oder gelöscht. Ich bin mir sicher, dass es einen guten Grund dafür gab. Ich habe jedoch meinen Code umgeschrieben:

Create Procedure spMoveToHistory(IN in_UserID char(6), IN in_MediaBarcode char(3)) 

BEGIN 

    SELECT @NextRow := (MAX(History_TUID) + 1) 
      From History; 

    SELECT @COM_UserID := (User_ID), 
      @COM_MediaBarcode := (Media_Barcode), 
      @COM_COD := (Check_Out_Date), 
      @COM_RD := (Return_Date) 
      From Checked_Out_Media 
      Where User_ID = in_UserID AND Media_Barcode = in_MediaBarcode; 

    INSERT Into history 
      VALUES(@NextRow, @COM_UserID, @COM_MediaBarcode, @COM_COD, @COM_RD); 

    DELETE From checked_out_media 
      Where User_ID = in_UserID AND Media_Barcode = in_MediaBarcode; 

END