2011-09-11 43 views
0

我沒有什麼SQL經驗,所以這個問題可能有點顯而易見,但是從我讀過的內容來看,我似乎正確使用了BEGIN/END。我使用BEGIN/END爲了讓多個語句連續執行。我們的目標是從表格中刪除以前的「優勝者」,然後用新的「勝利者」計算並填充表格。該表應該只有一個記錄;獲勝者,冠軍。無論結構如何,我都無法處理任何超過第一個有效聲明的內容。帶有多個語句的SQL過程

create procedure contest.getWinner() 
begin 
    begin 
     delete from contest.winner 
     where stars > 0; 
    end 

    begin 
    insert into contest.winner(img, stars, cur_DT) 
     (SELECT A.img, A.stars, now() 
      FROM 
      ( 
       SELECT 
        I.img, 
        SUM(I.stars) as stars, 
        MIN(I.cur_DT) as TieBreaker 
       FROM 
        contest.votes as I 
       GROUP BY I.img 
      )as A 
      ORDER BY 
      A.stars DESC, 
      A.TieBreaker 
      limit 1 
     ); 
    end 
end 

+1

哪個數據庫引擎?你有什麼錯誤嗎? – Nivas

+0

你有沒有嘗試刪除內部的開始/結束? –

+0

我在win7上使用MySql,並在MySql Workbench中編輯。我已經嘗試了開始/結束的每一個排列,包括標籤,'開始嘗試',嵌套開始/結束,單個外部大多數開始/結束等... – nullsteph

回答

2

這應該爲MSSQL服務器

create procedure getWinner 
as 

begin 
    delete from contest.winner 
    where stars > 0; 
end 

begin 
insert into contest.winner(img, stars, cur_DT) 
    (SELECT A.img, A.stars, GETDATE() 
     FROM 
     ( 
      SELECT 
       I.img, 
       SUM(I.stars) as stars, 
       MIN(I.cur_DT) as TieBreaker 
      FROM 
       contest.votes as I 
      GROUP BY I.img 
     )as A 
     ORDER BY 
     A.stars DESC, 
     A.TieBreaker 
     limit 1 
    ); 
End 
0

工作,如果您的RDBMS是SQL Server,使用此語法:

CREATE PROCEDURE <name> 
AS 
BEGIN 
    <sql_statement>; 
    <sql_statement>; 
    <sql_statement>; 
END 

您必須添加的 「AS」 關鍵字在「BEGIN」之前。

0

這應該在MySQL的

delimiter // 

    create procedure contest.getWinner() 
    begin 
     delete from contest.winner 
     where stars > 0; 

     insert into contest.winner(img, stars, cur_DT) 
      (SELECT A.img, A.stars, now() 
       FROM 
       ( 
        SELECT 
         I.img, 
         SUM(I.stars) as stars, 
         MIN(I.cur_DT) as TieBreaker 
        FROM 
         contest.votes as I 
        GROUP BY I.img 
       )as A 
       ORDER BY 
       A.stars DESC, 
       A.TieBreaker 
       limit 1 
      ); 

    end; // 

delimiter ; 

的問題是,在MySQL中;是分隔符,所以當工作臺看到它時,它會嘗試結束該過程。通過將分隔符更改爲其他內容,您可以創建該過程。之後,您可以恢復原始語句分隔符。

+0

notta。我使用的是最新版本的MySql工作臺,並且得到相同的錯誤 - '使用附近的語法' 開始 – nullsteph

+0

我認爲。在程序名稱可能是問題。你可以嘗試與Contest_GetWinner() – Sparky

+0

相同的錯誤。我已經成功創建了其他單一語句,使用'點'符號的程序。不管我嘗試什麼,我只能得到保存在SP中的第一條語句。所有其他陳述,無論是出錯,還是根本不包含在SP中。 – nullsteph