在游标内检索 Oracle 中的选择计数(*)

Posted

技术标签:

【中文标题】在游标内检索 Oracle 中的选择计数(*)【英文标题】:Retrieve a select count(*) in Oracle inside a cursor 【发布时间】:2013-02-27 08:54:53 【问题描述】:

我需要检索游标内(在 Oracle 中)的 SELECT COUNT(*) 语句中的行数。

下面的代码应该解释清楚了:

PROCEDURE Save(CF_CURSOR OUT "VPA"."CF_#Runtime".CF_CURSOR_TYPE) AS
    V_CF_CURSOR "VPA"."CF_#Runtime".CF_CURSOR_TYPE;
    CF_ROWCOUNT NUMBER;
    BEGIN
        OPEN V_CF_CURSOR FOR
        SELECT COUNT(*) INTO CF_ROWCOUNT FROM (
            SELECT * FROM "VPA"."Employee" -- returns 1 row
        ) WHERE ROWNUM <= 1;
        IF(CF_ROWCOUNT = 0) THEN
            -- DO SOMETHING BUT NEVER GOES HERE
        END IF;
        COMMIT;
    CF_CURSOR := V_CF_CURSOR;
    END;

在这里,CF_ROWCOUNT 的值永远不会被设置。如果我删除光标,一切都会按预期工作。我曾尝试使用 SQL%ROWCOUNT,但它也不起作用。 而且,我无法移除光标...

提前致谢!

【问题讨论】:

首先它不起作用,因为您的语法不正确。其次,当你写 “我尝试使用 SQL%ROWCOUNT,但它也不起作用” 时,什么不起作用?你收到错误信息了吗?你跑了什么?最后,您是只是想获得计数,还是还想使用员工中的数据? 你不应该在光标上做FETCH 才能得到结果吗? 【参考方案1】:

您是否尝试过打开游标 - 它执行 COUNT(*),然后将其提取到 CF_ROWCOUNT 变量中,而不是在 ref-cursor 语句中将其作为 INTO 执行。

例如:

OPEN V_CF_CURSOR FOR SELECT COUNT(*) FROM "VPA"."Employee"; -- returns 1 row
FETCH V_CF_CURSOR INTO CF_ROWCOUNT;

【讨论】:

感谢您提供此解决方案。主要问题是此代码是自动生成的,我无法完全控制生成的内容。您的解决方案有效。但我决定删除游标(这可行),因为我只需要检索使用 select 语句获取的行数,无需其他任何内容。

以上是关于在游标内检索 Oracle 中的选择计数(*)的主要内容,如果未能解决你的问题,请参考以下文章

Sql中的游标是干嘛的

oracle sql动态查询以选择游标中的列

Oracle 选择变量,错误 ORA-00947 没有足够的值

使用选择而不是表的游标循环(Oracle)

ibatis 怎么返回oracle游标

如何从从 plsql 函数 ORACLE 返回的游标中进行选择