【问题标题】:ORACLE SQL PROCEDURE WITH FOR LOOP AND IF ELSE ERROR带有 FOR 循环和 IF ELSE 错误的 ORACLE SQL 过程
【发布时间】:2020-05-30 15:20:18
【问题描述】:

我需要将特定日期的班次表中的员工 ID 替换为在特定日期没有任何班次的另一个员工 ID。 这是我的桌子,

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;
 /

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

【问题讨论】:

    标签: sql oracle stored-procedures plsql


    【解决方案1】:

    我不是在看你应用的逻辑;我希望你做对了。我刚刚修复了阻止您编写的代码编译的错误;例如:

    • 不要将参数命名为列名;使用一些前缀,例如par_p_
    • 在游标 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>
    

    【讨论】:

    • 非常感谢,现在编译。你节省了我很多时间。再次感谢你。
    • 不客气。正如您已经被告知的那样:在 Stack Overflow 上,“谢谢”最好通过支持和/或接受对您有帮助的答案来表达。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多