PROCEDURE UpdateAttendance
(
V_AttendanceDate DATE,
V_LoginId varchar2,
V_SignType varchar2,
V_IpAddress varchar2,
V_LogonUserName VARCHAR2,
V_ShiftName VARCHAR2,
V_WorkLocationType VARCHAR2,
V_WorkLocation VARCHAR2,
V_Self_Covid_Status VARCHAR2,
V_Self_Covid_Remark VARCHAR2,
V_Family_Covid_Status VARCHAR2,
V_Family_Covid_Remark VARCHAR2,
curAttendanceDate OUT T_CURSOR
) AS BEGIN
- In this section I am getting error SELECT CASE WHEN SignOut IS NULL THEN INTERVAL '-1' DAY (5) + V_AttendanceDate ELSE V_AttendanceDate END
INTO V_AttendanceDate FROM T_ATTENDANCE_ATTENDANCE
WHERE UPPER (ShiftName) = 'NIGHT'
AND LoginId = V_LoginId
AND AttendanceDate = INTERVAL '-1' DAY (5) + V_AttendanceDate
AND V_SignType = 'SIGNOUT'
AND Active = 1;
UPDATE T_ATTENDANCE_ATTENDANCE
SET SignIn =
CASE
WHEN V_SignType = 'SIGNIN'
AND SignIn IS NULL
THEN
SYSDATE
ELSE
SignIn
END,
SignOut =
CASE
WHEN V_SignType = 'SIGNOUT'
AND signout IS NULL
THEN
SYSDATE
ELSE
SignOut
END,
IpAddress =
CASE
WHEN NVL (IpAddress, '') = '' THEN V_IPAddress
ELSE IpAddress || ',' || V_IPAddress
END,
LogonUserName =
CASE
WHEN NVL (LogonUserName, '') = '' THEN V_LogonUserName
ELSE LogonUserName || ',' || V_LogonUserName
END,
WorkLocation =
CASE
WHEN V_SignType = 'SIGNIN' THEN V_WorkLocation
ELSE WorkLocation
END,
WorkLocationType =
CASE
WHEN V_SignType = 'SIGNIN' THEN V_WorkLocationType
ELSE WorkLocationType
END,
ShiftName =
CASE
WHEN V_SignType = 'SIGNIN'
AND NVL (ShiftName, '') = ''
THEN
V_ShiftName
ELSE
ShiftName
END
WHERE AttendanceDate = V_AttendanceDate
AND LoginId = V_LoginId
AND Active = 1;
UPDATE T_ATTENDANCE_ATTENDANCE
SET ShiftName = 'LEAVE'
WHERE AttendanceDate < SYSTIMESTAMP - 2
AND SignIn IS NULL
AND SignOut IS NULL
AND ShiftName IN ('MORNING',
'AFTERNOON1',
'AFTERNOON2',
'GENERAL1',
'GENERAL2',
'NIGHT');
INSERT INTO T_ATTENDANCE_USER_COVID_STATUS (LoginId,
AttendanceDate,
Self_Covid_Status,
Self_Covid_Remark,
Family_Covid_Status,
Family_Covid_Remark,
UpdatedOn,
UpdatedBy)
SELECT V_LoginId,
V_AttendanceDate,
V_Self_Covid_Status,
V_Self_Covid_Remark,
V_Family_Covid_Status,
V_Family_Covid_Remark,
SYSTIMESTAMP,
UPPER (V_LoginId)
FROM DUAL
WHERE V_SignType = 'SIGNIN';
END UpdateAttendance;
Among other errors, you cannot use a
SELECTstatement on its own in PL/SQL. You need toSELECT ... [BULK COLLECT] INTO .... However, you don't even want to do that and instead should combine your calendar generation into theINSERTstatement:Additionally,
E.Company NOT IN ('')andE.Company = ''will never be true as, in Oracle,''is identical toNULLand Oracle uses trinary logic soE.Company NOT IN (NULL)andE.Company = NULLdo not evaluate toTRUEorFALSEbut, instead, both evaluate toNULLand sinceNULLis notTRUEthen neither branch of your logic will match.What you want is to use
E.Company IS NOT NULLandE.company IS NULLto match non-empty and empty strings.