繁体   English   中英

具有子查询的 PROCEDURE 中的 CURSOR

CURSOR in a PROCEDURE that have a sub query

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在 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”,这是为什么? 我不能在游标中使用子查询?

2 个回复

它不起作用,因为光标不敏感,这意味着它指向真实数据。 它不适用于这样的子查询:

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;

据我所知,游标不能用子查询声明。

3 使用游标在oracle过程中进行动态查询

我正在使用存储过程使用游标选择记录。 此过程将记录ID作为输入。 这是代码: 为了调用/测试程序,我使用下面的代码: 问题是当我传递一个整数,如'4'或'2'时,过程返回数据,但当我传递'1,2'或'3,4'时,它显示错误。 ...

4 Oracle存储过程查询无法使用游标

我是oracle新手,并尝试使用以下pl / sql代码创建存储过程。 代码有什么问题?当我用硬代码值“ 1605%”替换searchString时,将执行查询,但不使用变量。 有人可以帮我在这里做错什么吗? 谢谢 ...

6 过程游标返回变量并遍历查询

我对此程序有疑问。 我想做的是传入一个变量,即ID,然后设置一个可靠的变量并返回查询/游标。 昨天我在这方面得到了一些帮助,但某些地方不正确,因此无法编译。 有人可以帮我解决这个问题吗? 这是我到目前为止所拥有的。 我不确定我将光标设置为向右返回,也不确定我是否正确循环以设置Mo ...

7 sql存储过程子查询错误

我正在尝试使用OUTPUT参数为用户登录编写存储过程,但是我收到以下错误: 存储过程: 这个问题怎么解决? ...

2014-03-19 17:54:40 2 93   sql
9 存储过程错误中不允许子查询

我正在尝试执行一个过程,但是该过程的以下部分出现错误。 出现以下错误: PL / SQL:语句被忽略错误PLS-00405:PLS-00405中不允许子查询:在这种情况下,此上下文中不允许子查询ERROR 代码是: 我该如何重写此查询? 提前致谢。 ...

10 程序中的游标

我的代码出现以下错误 ORA-06550:第17行,第0列:PLS-00103:在预期以下情况之一时遇到了符号“文件结束”: 请在这里帮我 谢谢 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM