J'ai une table simple Je suis d'insérer ou de mise à jour des enregistrements à l'aide d'une procédure comme celle-ci p> je suis Appeler la procédure comme ceci: p> Le problème est que je passe Le code ci-dessus est simplifié et le code exact est ici P> 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.
SQL% RowCount code> Déclaration renvoie 1 fort>. Quelqu'un peut-il m'aider à résoudre ce problème? 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;
3 Réponses :
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>
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ù i> dans le code, mais où vous en avez besoin (c'est-à-dire de vérifier si vous avez mis à jour quelque chose ou non).
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;
Maintenant, il est plus clair.
Ce code: p>
IF(Username_Row_Count = 0 AND Email_Row_Count = 0) THEN
Je dois donc ajouter SQL% RowCount code> 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 b> lorsque vous avez réellement performé certaines manipulations sur les données.
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