Oracle SQL%ROWCOUNT语句始终返回1

时间:2019-04-16 05:58:09

标签: oracle plsql oracle11g oracle10g

我在Oracle中有一个简单的表USERS,其中有2列IDUSERNAMEID是主键,并使用触发器自动递增。

我正在使用类似过程插入或更新记录

CREATE OR REPLACE PROCEDURE SaveUser(UID NUMBER, UN VARCHAR2, Row_Count OUT NUMBER) IS
BEGIN
    IF(UID > 0) THEN
        UPDATE USERS SET USERNAME = UN WHERE ID = UID;
    ELSE
        INSERT INTO USERS(USERNAME) VALUES(UN);
    END IF;

    Row_Count := SQL%ROWCOUNT;
END;

我正在这样调用程序:

VARIABLE Row_Count NUMBER;
EXEC SaveUser(50, 'Username_1', Row_Count);
PRINT Row_Count;

问题是我将 50 作为第一个参数传递,但是表中没有包含ID 50 的行。但是结果是 1 。即使该行未更新,SQL%ROWCOUNT语句也会返回 1 。谁能帮我解决这个问题?

上面的代码是简化的代码,确切的代码在这里

CREATE OR REPLACE PROCEDURE SaveEmployee(ID NUMBER, User_Name VARCHAR2, Emp_Password VARCHAR2, Emp_Full_Name VARCHAR2, Emp_Date_Of_Birth DATE, Emp_Gender_ID NUMBER, Emp_Work_Type_ID NUMBER, Emp_Salary FLOAT, Emp_Email VARCHAR2, Row_Count OUT NUMBER) IS
    Username_Row_Count NUMBER := 0;
    Email_Row_Count NUMBER := 0;
BEGIN
    IF(ID > 0) THEN
        SELECT COUNT(1) INTO Username_Row_Count FROM EMPLOYEES WHERE LOWER(USERNAME) = LOWER(User_Name) AND EMPLOYEE_ID <> ID;
        SELECT COUNT(1) INTO Email_Row_Count FROM EMPLOYEES WHERE LOWER(EMAIL) = LOWER(Emp_Email) AND EMPLOYEE_ID <> ID;

        IF(Username_Row_Count = 0 AND Email_Row_Count = 0) THEN
            UPDATE EMPLOYEES
            SET USERNAME = LOWER(User_Name), PASSWORD = Emp_Password, FULL_NAME = Emp_Full_Name, DATE_OF_BIRTH = Emp_Date_Of_Birth, GENDER_ID = Emp_Gender_ID, WORK_TYPE_ID = Emp_Work_Type_ID, SALARY = Emp_Salary, EMAIL = LOWER(Emp_Email)
            WHERE EMPLOYEE_ID = ID;
        END IF;
    ELSE
        SELECT COUNT(1) INTO Username_Row_Count FROM EMPLOYEES WHERE LOWER(USERNAME) = LOWER(User_Name);
        SELECT COUNT(1) INTO Email_Row_Count FROM EMPLOYEES WHERE LOWER(EMAIL) = LOWER(Emp_Email);

        IF(Username_Row_Count = 0 AND Email_Row_Count = 0) THEN
            INSERT INTO EMPLOYEES(USERNAME, PASSWORD, FULL_NAME, DATE_OF_BIRTH, GENDER_ID, WORK_TYPE_ID, SALARY, EMAIL, LOGIN_ATTEMPTS)
            VALUES(LOWER(User_Name), Emp_Password, Emp_Full_Name, Emp_Date_Of_Birth, Emp_Gender_ID, Emp_Work_Type_ID, Emp_Salary, LOWER(Emp_Email), 0);
        END IF;
    END IF;

    Row_Count := SQL%ROWCOUNT;
END;

3 个答案:

答案 0 :(得分:1)

我无法复制你在说什么:

SQL> select * from users;

no rows selected

SQL> declare
  2    uid number := 50;
  3  begin
  4    if uid > 0 then
  5       update users set username = '&&un' where id = uid;
  6    else
  7       insert into users (username) values ('&&un');
  8    end if;
  9    dbms_output.put_line(sql%rowcount);
 10  end;
 11  /
Enter value for un: 50
0                              --> this is SQL%ROWCOUNT

PL/SQL procedure successfully completed.

SQL>

您发布的代码无效(没有NUBER数据类型)。如果您发布的内容实际上 会有所帮助,因为-您所说的方式-我们无法确定您声称为真实的是 是真实的。请复制/粘贴您自己的SQL * Plus会话(就像我一样),以便我们了解您真正拥有的内容以及Oracle的响应方式。

答案 1 :(得分:1)

在更新后 添加SQL%ROWCOUNT以获得更新计数

UPDATE EMPLOYEES
            SET USERNAME = LOWER(User_Name), PASSWORD = Emp_Password, FULL_NAME = Emp_Full_Name, DATE_OF_BIRTH = Emp_Date_Of_Birth, GENDER_ID = Emp_Gender_ID, WORK_TYPE_ID = Emp_Work_Type_ID, SALARY = Emp_Salary, EMAIL = LOWER(Emp_Email)
            WHERE EMPLOYEE_ID = ID;
Row_Count := SQL%ROWCOUNT;

答案 2 :(得分:1)

现在更清楚了。

此代码:

SELECT COUNT(1) INTO Username_Row_Count FROM EMPLOYEES WHERE LOWER(USERNAME) = LOWER(User_Name) AND EMPLOYEE_ID <> ID;
SELECT COUNT(1) INTO Email_Row_Count FROM EMPLOYEES WHERE LOWER(EMAIL) = LOWER(Emp_Email) AND EMPLOYEE_ID <> ID;

必须更新值Username_Row_CountEmail_Row_Count,以便条件

IF(Username_Row_Count = 0 AND Email_Row_Count = 0) THEN

始终为假。而且更新永远不会执行。结果,在您的Row_Count变量中,您获得了最后选择的结果,即1行。