Oracle
 sql >> Database >  >> RDS >> Oracle

Aggiornamento di una tabella in Oracle se un valore di campo è nullo e determinazione dell'esito positivo dell'aggiornamento

Potrebbe essere necessario aggiorna solo i campi particolari di una tabella o tutti i campi se i loro valori sono null, altrimenti non è necessario aggiornare alcun campo. Di seguito è riportata la procedura di esempio per lo stesso scopo scritta sulla tabella HR.Employees:CREATE OR REPLACE PROCEDURE HR.UpdateEmpIfNull ( PN_EMPLOYEE_ID IN NUMBER, PV_FIRST_NAME IN VARCHAR2, PV_LAST_NAME IN VARCHAR2, PV_EMAIL IN VARCHAR2, PV_PHONE_NUMBER IN VARCHAR2, PD_HIRE_DATE IN DATE, PV_JOB_iD IN VARCHAR2, PN_SALARY IN NUMBER, PV_Success OUT VARCHAR2)IS n_length NUMBER; n_length2 NUMERO;BEGIN SELECT LENGTH( FIRST_NAME || COGNOME || EMAIL || PHONE_NUMBER || DATA_ASSUNZIONE || JOB_ID || STIPENDIO) IN n_length DA HR.DIPENDENTI DOVE EMPLOYEE_ID =PN_EMPLOYEE_ID; UPDATE HR.EMPLOYEES SET FIRST_NAME =DECODE (FIRST_NAME, NULL, PV_FIRST_NAME, FIRST_NAME), COGNOME =DECODE (COGNOME, NULL, pv_LAST_NAME, LAST_NAME), EMAIL =DECODE (EMAIL, NULL, pv_EMAIL, EMAIL), PHONE_NUMBER =DECODE (PHONE_NUMBER, NULL, pv_PHONE_NUMBER, PHONE_NUMBER), HIRE_DATE =DECODE (HIRE_DATE, NULL, pD_HIRE_DATE, HIRE_DATE), JOB_ID =DECODE (JOB_ID, NULL, pV_JOB_ID, JOB_ID), STIPENDIO =DECODE (SALARY, NULL, pN_SALARY, STIPENDIO) WHERE EMPLOYEE_ID =PN_EMPLOYEE_ID; /* Usando la query seguente per determinare se l'aggiornamento ha avuto successo, non possiamo usare qui sql%rowcount o sql%found per determinare perché se l'ID dipendente è corretto, mostrerà sempre un aggiornamento riuscito ma dobbiamo determinare se qualsiasi campo null il valore è stato aggiornato o meno */ SELECT LENGTH( FIRST_NAME || LAST_NAME || EMAIL || PHONE_NUMBER || HIRE_DATE || JOB_ID || STIPENDIO) IN n_length2 DA HR.EMPLOYEES WHERE EMPLOYEE_ID =PN_EMPLOYEE_ID; SE n_lunghezza2> n_lunghezza ALLORA --- Salva le modifiche. COMMETTERE; Pv_Success :='Y'; ALTRO ROLLBACK; pv_success :='N'; FINE SE;ECCEZIONE QUANDO ALTRI ALLORA Pv_Success :='N'; ROLLBACK;END;/