0
votes

Oracle SQL% RowCount Déclaration Retourne toujours 1

J'ai une table simple utilisateurs code> dans oracle avec 2 colonnes id code> et nom d'utilisateur code>. ID code> est la clé primaire et auto incrémentée à l'aide d'un déclencheur.

Je suis d'insérer ou de mise à jour des enregistrements à l'aide d'une procédure comme celle-ci p> xxx pré>

je suis Appeler la procédure comme ceci: p> xxx pré>

Le problème est que je passe 50 fort> comme premier paramètre, mais dans le tableau, il n'y a pas de ligne avec ID code> 50 fort>. Mais je reçois 1 fort> comme résultat. Même si la ligne n'est pas mise à jour, SQL% RowCount code> Déclaration renvoie 1 fort>. Quelqu'un peut-il m'aider à résoudre ce problème? P>

Le code ci-dessus est simplifié et le code exact est ici P>

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;


4 commentaires

Est-ce la procédure réelle que vous exécutez ou une simplification? Êtes-vous sûr qu'il n'y a pas de ligne avec id = 50?


C'est un simplifié. Oui cela confirme qu'il n'y a pas de ligne avec id = 50


Montrez-nous le code réel. Le problème est quelque part que vous n'avez pas posté.


Mise à jour de la question avec le code réel


3 Réponses :


0
votes

Je ne peux pas reproduire ce que vous dites:

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>


3 commentaires

Oui tu peux. Merci, mais ça ne suffit pas. SQL * Plus Session, s'il vous plaît.


J'ai ajouté la procédure exacte et j'ai mis à jour la question


SQL% RowCount Vous avez fait référence à sélectionner également, donc - bien que vous ne vous ayez rien mis à jour, si le dernier sélection que vous avez répondu renvoyé une ligne, vous obtiendrez «1» à la suite. N'utilisez pas SQL% RowCount n'importe où dans le code, mais où vous en avez besoin (c'est-à-dire de vérifier si vous avez mis à jour quelque chose ou non).



0
votes

Ajouter SQL% RowCount Code> après FORT> La mise à jour pour obtenir le compte de mise à jour

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;


0 commentaires

0
votes

Maintenant, il est plus clair.

Ce code: p>

IF(Username_Row_Count = 0 AND Email_Row_Count = 0) THEN


2 commentaires

Je dois donc ajouter SQL% RowCount immédiatement après l'instruction Mettre à jour et un autre après insertion?


@ A.M.Rossi, oui, ce serait bien meilleur. Mettez à jour cette variable uniquement lorsque vous avez réellement performé certaines manipulations sur les données.