J'ai un script que j'utilise dans SQL Server mais je dois le convertir au format Oracle. Quelqu'un peut-il aider?
UPDATE PERSONS P SET
P.JOBTITLE=TE.JOBTITLE,
P.LAST_NAME=TE.LAST_NAME,
P.FIRST_NAME=TE.FIRST_NAME,
P.DBLOGIN_ID=TE.DBLOGIN_ID,
P.EMAIL_ID=TE.EMAIL_ID,
P.USERLEVEL=TE.USERLEVEL,
P.FACILITY_ID=TE.FACILITY_ID,
P.SUPERVISOR=TE.SUPERVISOR,
P.DEPARTMENT=TE.DEPARTMENT,
P.WINLOGINID=TE.WINLOGINID
FROM TEMP_ECOLAB_PERSONS TE
WHERE P.PERSON=TE.PERSON;
--Dans l'article ci-dessous, j'ai trouvé la déclaration suivante. Cela ne fonctionne toujours pas malheureusement:
UPDATE (SELECT P.JOBTITLE, P.LAST_NAME, P.FIRST_NAME, P.DBLOGIN_ID, P.EMAIL_ID,
P.USERLEVEL, P.FACILITY_ID, P.SUPERVISOR, P.DEPARTMENT,
TE.JOBTITLE, TE.LAST_NAME, TE.FIRST_NAME, TE.DBLOGIN_ID, TE.EMAIL_ID,
TE.USERLEVEL, TE.FACILITY_ID, TE.SUPERVISOR, TE.DEPARTMENT
FROM PERSONS P, TEMP_ECOLAB_PERSONS TE WHERE P.PERSON=TE.PERSON)
SET
P.JOBTITLE=TE.JOBTITLE,
P.LAST_NAME=TE.LAST_NAME,
P.FIRST_NAME=TE.FIRST_NAME,
P.DBLOGIN_ID=TE.DBLOGIN_ID,
P.EMAIL_ID=TE.EMAIL_ID,
P.USERLEVEL=TE.USERLEVEL,
P.FACILITY_ID=TE.FACILITY_ID,
P.SUPERVISOR=TE.SUPERVISOR,
P.DEPARTMENT=TE.DEPARTMENT;
Voilà comment je le ferais. Ce n'est peut-être pas la meilleure performance, mais cela fonctionne.
MERGE INTO PERSONS_TMP PT
USING (
SELECT P.PERSON, P.JOB_TITLE, P.FIRST_NAME, P.LAST_NAME, P.FACILITY_ID
FROM PERSONS P) TMP
ON (PT.PERSON = TMP.PERSON)
WHEN MATCHED THEN
UPDATE SET
PT.FACILITY_ID = TMP.FACILITY_ID,
PT.JOB_TITLE = TMP.JOB_TITLE,
PT.FIRST_NAME = TMP.FIRST_NAME,
PT.LAST_NAME = TMP.LAST_NAME;
Le script ci-dessus mettra à jour les informations de la table PERSONS_TMP en utilisant les données de la table PERSONS. Je crois que dans votre cas, vous le voulez dans l'autre sens. Assurez-vous donc que vous apportez les modifications nécessaires avant d'exécuter le script.
Vous pouvez ajouter la clause "WHEN NOT MATCHED THEN ...." au code SQL ci-dessus au cas où vous auriez besoin d'insérer de nouveaux enregistrements, s'il n'existe pas.
UPDATE PERSONS P
SET (jobtitle,
last_name,
first_name,
dblogin_id,
email_Id,
userlevel,
facility_id,
supervisor,
department,
winloginid) = (select jobtitle,
last_name,
first_name,
dblogin_id,
email_Id,
userlevel,
facility_id,
supervisor,
department,
winloginid
from TEMP_ECOLAB_PERSONS TE
where TE.PERSON=P.PERSON);
Notez que s'il y a d'autres lignes présentes dans les personnes qui ne sont pas dans temp_ecolab_persons, ces lignes supplémentaires dans la table person seront définies sur null (ou pourraient entraîner l'échec de l'instruction avec une erreur de contrainte non nulle par la mise à jour ci-dessus, donc si c'est le Dans ce cas, vous pouvez également avoir besoin d'une clause where sur l'instruction de mise à jour pour les restreindre, par exemple si je sais que le champ email_id est rempli sur certains enregistrements mais pas sur d'autres, je peux limiter la mise à jour à ces lignes comme suit
UPDATE PERSONS P
SET (jobtitle,
last_name,
first_name,
dblogin_id,
email_Id,
userlevel,
facility_id,
supervisor,
department,
winloginid) = (select jobtitle,
last_name,
first_name,
dblogin_id,
email_Id,
userlevel,
facility_id,
supervisor,
department,
winloginid
from TEMP_ECOLAB_PERSONS TE
where TE.PERSON=P.PERSON)
WHERE email_id is null;