2011-09-11 15 views
0

SQLの経験はほとんどないので、この質問は少しはっきりしているかもしれませんが、私が読んだところではBEGIN/ENDを正しく使用しているようです。私は複数のステートメントを連続して実行させるためにBEGIN/ENDを使用しています。目標は、テーブルから以前の「勝者」を削除してから、新しい「勝者」でテーブルを計算して設定することです。テーブルは1つのレコードしか持たないはずです。勝者。ステートメントがどのように構成されていても、最初の有効なステートメントを過ぎて処理することはできません。複数の文を含む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

内部のbegin/endを削除しようとしましたか? –

+0

私はwin7でMySqlを使用し、MySql Workbenchで編集しています。私はラベルを含むbegin/endのすべての順列を試してきました。そして、 'begin try'、ネストされたbegin/end、single outterのほとんどのbegin/endなどを... – nullsteph

答えて

2

あなたのRDBMSがSQL Serverの場合、これは、この構文を使用し、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

のために働く必要があります。

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ワークベンチの最新バージョンを使用しており、同じエラーが発生しています - '近くで使用する構文' begin – nullsteph

+0

と思います。プロシージャ名に問題がある可能性があります。 Contest_GetWinner() – Sparky

+0

同じエラーで試してみることができますか?私は正常に他の、単一のステートメント、手順を 'ドット'表記を使用して作成しました。私が何を試みても、私は最初のステートメントをSPに保存することしかできません。他のすべてのステートメントは、エラーを出力するか、SPに単純に含まれません。 – nullsteph

関連する問題