-1

mysql でストアド プロシージャを作成するのに非常に苦労することがよくあります。本当に問題ないはずの構文が、ストアド プロシージャ内で解析されないだけです。これは、まだ解析されていない単純化されたバージョンです。このコードを解析可能なものに変換できません。

update..set 句で問題が発生する

更新
コードをさらに単純化しました。問題はまだ存在します。エラーメッセージが鳴り響くようです

更新 2
Mark Byers のおかげで解決しました。-statement 内のinto節はselect慎重に配置する必要があります。mysql のエラー メッセージがいかに誤解を招きやすく、ひどいものであるかに注意してください。

エラー 1064 (42000): SQL 構文にエラーがあります。マニュアルを確認する

   UPDATE page
   SET
   lft = 1
   where lft > 3 AN' at line 22

コード:

CREATE PROCEDURE `move_page_right`( subject_id SMALLINT UNSIGNED, reference_id SMALLINT UNSIGNED)


BEGIN 
    select 
        p.lft, 
        p.rgt, 
        p.rgt - p.lft,
        p.rgt + 1 
    into 
        @subject_old_lft, 
        @subject_old_rgt, 
        @subject_width, 
        @subject_old_right_sibling_lft 
    from page p 
    where p.page_id = subject_id; 


    select p.rgt + 1 
    from page p 
    into @subject_new_lft 
    where p.page_id = reference_id;

UPDATE page 
SET 
lft = 1 
where lft > 3 AND lft < 3;

END
4

2 に答える 2

1

テーブルのエイリアスが UPDATE 部分に入るとは思いません。エイリアスを削除してみてください。UPDATE ステートメントが複数のテーブルを参照する場合、更新されたテーブルを FROM 句 (または任意の結合) に配置し、UPDATE 部分でエイリアスのみを使用できます。

MySQLについてはわかりませんが、MS SQLではそういう仕組みなのでANSI規格なのかもしれません。

また、あなたが何を達成しようとしているのかわかりません。列をそれ自体に設定していますが、何もしません。

于 2009-12-14T20:54:38.993 に答える
1

申し訳ありませんが、ここでも推測していますが、すぐに取得できることを願っています... SELECT のドキュメントから:

SELECT
    select_expr
    FROM table_references
    WHERE where_condition
    INTO var_name

これらの句の順序が重要であると強く思います。エラーメッセージは誤解を招くものですが、クエリで順序を混同しています。これが問題を引き起こしている可能性があると思います。

ここでは、WHERE 句は INTO の前にある必要があります。

    select p.rgt + 1 
    from page p 
    into @subject_new_lft 
    where p.page_id = reference_id;

ここでは、INTO と FROM も逆になっています。

    select 
            p.lft, 
            p.rgt, 
            p.rgt - p.lft,
            p.rgt + 1 
    into 
            @subject_old_lft, 
            @subject_old_rgt, 
            @subject_width, 
            @subject_old_right_sibling_lft 
    from page p 
    where p.page_id = subject_id; 

ラウンドを変更してみて、それが役立つかどうかを確認してください。

于 2009-12-14T22:00:21.880 に答える