pl/sql 过程中的错误计数(*)

Posted

技术标签:

【中文标题】pl/sql 过程中的错误计数(*)【英文标题】:Wrong count(*) in pl/sql procedure 【发布时间】:2013-04-03 15:25:54 【问题描述】:

Oracle 11g 快捷版 11.2.0

表“RIGHT”数据(仅包含 1 行,名称 = Test):

标识 |名称

1 次测试

2 新的2

3 新14

...

从右侧选择计数(*)名称 = '测试';

结果 = 1

我在包 TEST 中有程序:

    create or replace
    PACKAGE BODY TEST
    AS
    PROCEDURE FIND_RIGHT(rightName IN VARCHAR2)
    IS
      countrows       NUMBER;
    BEGIN
      SELECT COUNT(*) INTO countrows FROM RIGHT WHERE name = rightName;

    /* DEBUG POINT !!! in this point countrows = 212 !!!! */
    ...
    END;
    END TEST;

并从其他程序运行它:

    DECLARE
      rightName VARCHAR2(200);
    BEGIN
      rightName := 'Test';
      TEST.FIND_RIGHT(rightName);
    END;

我在选择后运行调试器(在 Oracle SQL Developer 中)和调试点。 我看到countrows = 212。

为什么 countrows != 1 ???

更新: 所有事务都已提交。仅打开 1 个会话(来自 SQL Developer)。表权限有 3 个索引(表很大,我不会在帖子中写所有列)。过程有许多输入参数(自定义对象),但我删除了额外的信息。

更新 #2: 我将代码更改为

    create or replace
    PACKAGE BODY TEST
    AS
    PROCEDURE FIND_RIGHT(rightName IN VARCHAR2)
    IS
      countrows       NUMBER;
      testVar       VARCHAR2(200);
    BEGIN
      testVar := 'Test';
      SELECT COUNT(*) INTO countrows FROM RIGHT WHERE name = testVar;

    /* in this point countrows = 1  */
    ...
    END;
    END TEST;

【问题讨论】:

您是否在同一个 sql 开发人员窗口中运行了 count() 和 proc 调用?您是否还有任何未提交的事务(因为运行 pl/sql 调用的窗口可能已插入行但未提交它们)。最好通过 sqlplus 在同一会话中测试两者并显示输出。 是的。我在 sql 开发人员窗口中调用 proc。所有事务都已提交。仅打开 1 个会话。 如果您从单个 SQLplus 会话中尝试相同的操作?你能从 sql 中显示输出吗?plus 提示符? 您是否可能在同一个数据库中有多个名为“RIGHT”的表,但在不同的模式中?您可能想尝试完全限定正在访问的表,即使用 SCHEMA_NAME.TABLE_NAME。 我相信 RIGHT 是一个保留字 - 你可以更改表名(或创建另一个用于测试目的)并尝试使用新表名吗? 【参考方案1】:

我猜您的表中包含一个名为“rightName”的列?

如果是这种情况,您的原始查询将比较“name”和“rightName”列,而不是使用过程参数。

尝试更改参数名称。

【讨论】:

以上是关于pl/sql 过程中的错误计数(*)的主要内容,如果未能解决你的问题,请参考以下文章

ORA-06533: PL/SQL 中的下标超出计数 ORA-06512

将 XML 数据存储在表中的 PL/SQL 过程抛出错误(23,102):PL/SQL:ORA-00907:缺少右括号

PL/SQL 存储过程错误

PL/SQL 过程、游标、PLS- 00103 错误

使用 callproc 从 django 调用 PL/SQL 过程

使用 PL/SQL 根据 Oracle SQL 中的父项更新子计数器