sql >> Base de Datos >  >> RDS >> Oracle

Actualización de una tabla en Oracle si algún valor de campo es nulo y determinación de que la actualización es exitosa

Es posible que deba actualizar los campos particulares de una tabla o todos los campos si sus valores son nulos; de lo contrario, no es necesario actualizar ningún campo. A continuación se muestra el procedimiento de ejemplo para el mismo propósito escrito en la tabla HR.Employees:CREAR O REEMPLAZAR EL PROCEDIMIENTO 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_i DPV_JOB VARCHAR2, PN_SALARIO EN NÚMERO, PV_Success OUT VARCHAR2)ES n_longitud NÚMERO; n_length2 NÚMERO; COMENZAR SELECCIONAR LONGITUD( PRIMER NOMBRE || APELLIDO || CORREO ELECTRÓNICO || NÚMERO_TELÉFONO || FECHA_CONTRATACIÓN || ID_TRABAJO || SALARIO) EN n_longitud DESDE HR.EMPLEADOS DONDE EMPLEADO_ID =PN_EMPLOYEE_ID; ACTUALIZAR HR.EMPLOYEES SET FIRST_NAME =DECODE (FIRST_NAME, NULL, PV_FIRST_NAME, FIRST_NAME), LAST_NAME =DECODE (LAST_NAME, 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), SALARY =DECODE (SALARIO, NULL, pN_SALARY, SALARY) WHERE EMPLOYEE_ID =PN_EMPLOYEE_ID; /* Usando la consulta a continuación para determinar si la actualización fue exitosa, no podemos usar aquí sql%rowcount o sql%found para determinar porque si la identificación del empleado es correcta, siempre mostrará una actualización exitosa, pero necesitamos determinar si hay algún campo nulo el valor se actualizó o no */ SELECCIONE LONGITUD (FIRST_NAME || LAST_NAME || EMAIL || PHONE_NUMBER || HIRE_DATE || JOB_ID || SALARIO) EN n_longitud2 DESDE HR.EMPLEADOS DONDE EMPLEADO_ID =PN_EMPLOYEE_ID; SI n_longitud2> n_longitud ENTONCES --- Guardar cambios. COMPROMETERSE; Pv_Éxito :='Y'; DE LO CONTRARIO RETROCEDER; pv_éxito :='N'; FIN SI; EXCEPCIÓN CUANDO OTROS ENTONCES Pv_Success :='N'; RETROCEDER;FIN;/