-1

我经常很难在 mysql 中创建存储过程。应该很好的语法只是在存储过程中不被解析。这是一个仍然没有被解析的简化版本。我无法将此代码转换为可以解析的内容。

update..set 子句有问题

更新
我更加简化了代码。问题依然存在。错误消息似乎是隆隆声

更新 2
已解决,感谢 Mark Byers。into-语句中的子句必须select仔细定位。请注意 mysql 错误消息是多么误导和糟糕!

ERROR 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 回答