带有for循环和if else错误的oracle sql过程

anhgbhbe  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(357)

我需要将某一天的轮班表中的员工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;
 /

请任何人帮我解决这个问题。

cotxawn7

cotxawn71#

我不是在看你运用的逻辑;我希望你做得对。我刚刚修复了阻止您编写代码编译的错误;例如:
不要将参数命名为列名;使用一些前缀,例如。 par_ 或者 p_ 在cursor for循环中,不能有两个同名的列( shift_count ); 一个必须改变
此外,不能在同一语句的 CASE (这就是你所做的 shift_count )
布尔支持在oracle中有点奇怪。例如,在sql级别没有这样的数据类型。因此,您必须处理字符串或数字,然后将它们“转换”为布尔值(例如第26行)
我想其余的都可以。

SQL> CREATE OR REPLACE PROCEDURE change_shift_sheduled (
  2     par_employee_id  IN shift.employee_id%TYPE,
  3     par_shift_date   IN shift.shift_date%TYPE)
  4  AS
  5     check_con  BOOLEAN := TRUE;
  6  BEGIN
  7     FOR sick_emp_shift_rec IN (SELECT *
  8                                  FROM shift
  9                                 WHERE     shift.employee_id = par_employee_id
 10                                       AND shift.shift_date = par_shift_date)
 11     LOOP
 12        FOR emp_rec
 13           IN (  SELECT e.employee_id,
 14                        COUNT (e.employee_id) AS shift_count,
 15                        CASE
 16                           WHEN COUNT (e.employee_id) > 0 THEN 'FALSE'
 17                           ELSE 'TRUE'
 18                        END
 19                           AS shift_count_case
 20                   FROM employee e
 21                        LEFT OUTER JOIN shift s ON e.employee_id = s.employee_id
 22                  WHERE s.shift_date = par_shift_date
 23               GROUP BY e.employee_id)
 24        LOOP
 25           check_con :=
 26              CASE
 27                 WHEN emp_rec.shift_count_case = 'FALSE' THEN FALSE
 28                 ELSE TRUE
 29              END;
 30
 31           IF check_con
 32           THEN
 33              UPDATE shift s
 34                 SET s.employee_id = emp_rec.employee_id
 35               WHERE s.shift_id = sick_emp_shift_rec.shift_id;
 36
 37              EXIT;
 38           END IF;
 39        END LOOP;
 40     END LOOP;
 41  END;
 42  /

Procedure created.

SQL>

相关问题