我需要将某一天的轮班表中的员工id替换为另一个在某一天没有轮班的员工id。这是我的table,
CREATE TABLE EMPLOYEE
(EMPLOYEE_ID NUMBER(4) NOT NULL,
NAME VARCHAR(50),
GENDER VARCHAR(10),
BIRTH_DAY DATE,
PRIMARY KEY(EMPLOYEE_ID)
);
CREATE TABLE SHIFT
(SHIFT_ID NUMBER(4),
SHIFT_DATE DATE,
CUSTOMER_ID NUMBER(4),
SERVICE_ID NUMBER(4),
EMPLOYEE_ID NUMBER(4),
SHIFT_CHARGE FLOAT(10),
PRIMARY KEY(SHIFT_ID),
FOREIGN KEY (EMPLOYEE_ID) REFERENCES EMPLOYEE(EMPLOYEE_ID)
);
出于上述目的,我想创建一个过程。我创建的程序如下。但是有一个编译错误。
CREATE OR REPLACE PROCEDURE CHANGE_SHIFT_SHEDULED
(
EMPLOYEE_ID IN SHIFT.EMPLOYEE_ID%TYPE,
SHIFT_DATE IN SHIFT.SHIFT_DATE%TYPE
)
AS
CHECK_CON BOOLEAN:=TRUE;
BEGIN
FOR SICK_EMP_SHIFT_REC IN (SELECT * FROM SHIFT WHERE SHIFT.EMPLOYEE_ID=EMPLOYEE_ID AND SHIFT.SHIFT_DATE=SHIFT_DATE)
LOOP
FOR EMP_REC IN (
SELECT e.EMPLOYEE_ID,COUNT(e.EMPLOYEE_ID)AS SHIFT_COUNT,
CASE
WHEN SHIFT_COUNT>0 THEN FALSE
ELSE TRUE
END AS SHIFT_COUNT
FROM EMPLOYEE e LEFT OUTER JOIN SHIFT s ON e.EMPLOYEE_ID=s.EMPLOYEE_ID
WHERE s.SHIFT_DATE=SHIFT_DATE
GROUP BY e.EMPLOYEE_ID)
LOOP
CHECK_CON:=EMP_REC.SHIFT_COUNT;
IF CHECK_CON THEN
UPDATE SHIFT s SET s.EMPLOYEE_ID=EMP_REC.EMPLOYEE_ID WHERE s.SHIFT_ID=SICK_EMP_SHIFT_REC.SHIFT_ID;
EXIT;
END IF;
END LOOP;
END LOOP;
END;
/
请任何人帮我解决这个问题。
1条答案
按热度按时间cotxawn71#
我不是在看你运用的逻辑;我希望你做得对。我刚刚修复了阻止您编写代码编译的错误;例如:
不要将参数命名为列名;使用一些前缀,例如。
par_
或者p_
在cursor for循环中,不能有两个同名的列(shift_count
); 一个必须改变此外,不能在同一语句的
CASE
(这就是你所做的shift_count
)布尔支持在oracle中有点奇怪。例如,在sql级别没有这样的数据类型。因此,您必须处理字符串或数字,然后将它们“转换”为布尔值(例如第26行)
我想其余的都可以。