我在MySQL中有这个程序(它的一部分)
DECLARE num_rows INT(11) DEFAULT NULL;
DECLARE insert_result INT(11) DEFAULT NULL;
DECLARE var_user_id INT DEFAULT NULL;
DECLARE user_that_posted_this_post INT DEFAULT NULL;
DECLARE arg_in_group_id INT DEFAULT NULL;
DECLARE how_many_comments INT DEFAULT 0;
/* Cursor 1 (posts) */
DECLARE done INT DEFAULT 0;
DECLARE c1 CURSOR FOR
SELECT user_id
FROM user_rights
WHERE user_rights.right = 101 AND
user_rights.group_id =
(
SELECT
posted_in
FROM posts
WHERE
id = arg_post_id
)
ORDER BY user_id DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
/* See how many comments has this post */
SELECT count(id) FROM comments_posts WHERE posted_in = arg_post_id INTO how_many_comments;
/* Fetch the autor of this post and the group_id */
SELECT posted_by,posted_in FROM posts WHERE id = arg_post_id INTO user_that_posted_this_post,arg_in_group_id;
IF arg_post_id IS NULL OR arg_post_id = ''
THEN
SELECT '0' AS response;
ELSE
DELETE FROM posts WHERE id = arg_post_id;
END IF;
/* Increment the notifications for every afected user */
INSERT INTO t VALUES(0);
OPEN c1;
read_loop: LOOP
FETCH c1 INTO var_user_id;
IF done THEN
LEAVE read_loop;
ELSE
INSERT INTO t VALUES(var_user_id);
END IF;
END LOOP;
CLOSE c1;
我发生了一些有线事情(光标没有采取任何值),例如此查询
SELECT user_id
FROM user_rights
WHERE user_rights.right = 101 AND
user_rights.group_id =
(
SELECT
posted_in
FROM posts
WHERE
id = arg_post_id
)
返回在发布帖子的组中拥有权利101(读取)的所有用户。结果在sql中完美运行,例如
SELECT user_id
FROM user_rights
WHERE user_rights.right = 101 AND
user_rights.group_id =
(
SELECT
posted_in
FROM posts
WHERE
id = 247
)
RESULT
user_id
1
3
2
16
17
20
19
但是当我尝试从CURSOR
/* Increment the notifications for every afected user */
INSERT INTO t VALUES(0);
OPEN c1;
read_loop: LOOP
FETCH c1 INTO var_user_id;
IF done THEN
LEAVE read_loop;
ELSE
INSERT INTO t VALUES(var_user_id);
END IF;
END LOOP;
CLOSE c1;
它不起作用......它只在t
表中写“0”为什么会这样?我不能在游标中使用子查询?
答案 0 :(得分:0)
它不起作用,因为光标是敏感的,这意味着它指向真实数据。它不适用于这样的子查询:
DECLARE c1 CURSOR FOR
SELECT user_id
FROM user_rights
WHERE user_rights.right = 101 AND
user_rights.group_id =
(
SELECT
posted_in
FROM posts
WHERE
id = arg_post_id
)
ORDER BY user_id DESC;
答案 1 :(得分:0)
据我所知,无法使用子查询声明游标。