如何编写PL/SQL以在插入之前首先检查记录是否存在

如何编写PL/SQL以在插入之前首先检查记录是否存在,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,背景:我有以下表格: TUTPRAC:CLASSID、UNITCODE、STAFFNO、CLASSDAY、CLASSTIME、CLASSTYPE、ROOMNUM UNITSTREAM:STREAMID、UNITCODE、STAFFNO、日期、时间、位置 问题:所以我有一个数据库和表,我试图创建一个函数,在打开一个新类之前检查一个类是否已打开 程序必须确保在时间、日期或位置方面不存在任何重叠冲突 为该单元提供讲座、tute课程和prac课程。TUTPRACS包含教程和练习的记录,而UNITSTRE

背景:我有以下表格:

TUTPRAC:CLASSID、UNITCODE、STAFFNO、CLASSDAY、CLASSTIME、CLASSTYPE、ROOMNUM

UNITSTREAM:STREAMID、UNITCODE、STAFFNO、日期、时间、位置

问题:所以我有一个数据库和表,我试图创建一个函数,在打开一个新类之前检查一个类是否已打开 程序必须确保在时间、日期或位置方面不存在任何重叠冲突 为该单元提供讲座、tute课程和prac课程。TUTPRACS包含教程和练习的记录,而UNITSTREAM包含streams讲座的记录

我也希望这个过程也能顺利进行 引发名为CLASS_OVERLAPS的异常,该异常在发生冲突时打印警报消息

我对PL/SQL非常陌生,因此非常感谢您的帮助

CREATE OR REPLACE PROCEDURE OPEN_CLASS(
           p_class IN TUTPRAC.CLASSID%TYPE,
           p_unitc IN TUTPRAC.UNITCODE%TYPE,
           p_classd IN TUTPRAC.CLASS_DAY%TYPE,
           p_classt IN TUTPRAC.CLASS_TIME%TYPE,
           p_classtp IN TUTPRAC.CLASS_TYPE%TYPE,
           p_roomnm IN TUTPRAC.ROOMNUM%TYPE)
    IS
    BEGIN

      INSERT INTO TUTPRAC ("CLASSID", "UNITCODE", "CLASS_DAY", "CLASS_TIME", "CLASS_TYPE", "ROOMNUM") 
      VALUES (p_class, p_unitc, p_classd, p_classt, p_classtp, p_roomnm);

      COMMIT;

    END;
您可以这样尝试:

CREATE OR REPLACE PROCEDURE OPEN_CLASS(
           p_class IN TUTPRAC.CLASSID%TYPE,
           p_unitc IN TUTPRAC.UNITCODE%TYPE,
           p_classd IN TUTPRAC.CLASS_DAY%TYPE,
           p_classt IN TUTPRAC.CLASS_TIME%TYPE,
           p_classtp IN TUTPRAC.CLASS_TYPE%TYPE,
           p_roomnm IN TUTPRAC.ROOMNUM%TYPE)
    IS
    BEGIN

DECLARE
    x NUMBER:=0;
BEGIN
    -- checks
    SELECT nvl((SELECT 1 FROM TUTPRAC WHERE CLASSID = p_class and UNITCODE  = p_unitc and CLASS_DAY = p_classd and CLASS_TIME = p_classt and CLASS_TYPE = p_classtp and ROOMNUM = p_roomnm) , 0) INTO x FROM dual;

    -- insert
    IF (x = 1) THEN
        INSERT INTO TUTPRAC ("CLASSID", "UNITCODE", "CLASS_DAY", "CLASS_TIME", "CLASS_TYPE", "ROOMNUM") 
      VALUES (p_class, p_unitc, p_classd, p_classt, p_classtp, p_roomnm);
    END IF;

END;
    CREATE OR REPLACE PROCEDURE OPEN_CLASS(
               p_class IN TUTPRAC.CLASSID%TYPE,
               p_unitc IN TUTPRAC.UNITCODE%TYPE,
               p_classd IN TUTPRAC.CLASS_DAY%TYPE,
               p_classt IN TUTPRAC.CLASS_TIME%TYPE,
               p_classtp IN TUTPRAC.CLASS_TYPE%TYPE,
               p_roomnm IN TUTPRAC.ROOMNUM%TYPE)
        IS
        BEGIN

          INSERT INTO TUTPRAC ("CLASSID", "UNITCODE", "CLASS_DAY", "CLASS_TIME", "CLASS_TYPE", "ROOMNUM") 
INSERT INTO table
SELECT p_class, p_unitc, p_classd, p_classt, p_classtp, p_roomnm
  FROM dual 
 WHERE NOT EXISTS (SELECT NULL 
                     FROM TUTPRAC 
                    WHERE CLASSID = p_class and UNITCODE  = p_unitc and CLASS_DAY = p_classd and CLASS_TIME = p_classt and CLASS_TYPE = p_classtp and ROOMNUM = p_roomnm
                  )
或者,您可以使用如下方式:

CREATE OR REPLACE PROCEDURE OPEN_CLASS(
           p_class IN TUTPRAC.CLASSID%TYPE,
           p_unitc IN TUTPRAC.UNITCODE%TYPE,
           p_classd IN TUTPRAC.CLASS_DAY%TYPE,
           p_classt IN TUTPRAC.CLASS_TIME%TYPE,
           p_classtp IN TUTPRAC.CLASS_TYPE%TYPE,
           p_roomnm IN TUTPRAC.ROOMNUM%TYPE)
    IS
    BEGIN

DECLARE
    x NUMBER:=0;
BEGIN
    -- checks
    SELECT nvl((SELECT 1 FROM TUTPRAC WHERE CLASSID = p_class and UNITCODE  = p_unitc and CLASS_DAY = p_classd and CLASS_TIME = p_classt and CLASS_TYPE = p_classtp and ROOMNUM = p_roomnm) , 0) INTO x FROM dual;

    -- insert
    IF (x = 1) THEN
        INSERT INTO TUTPRAC ("CLASSID", "UNITCODE", "CLASS_DAY", "CLASS_TIME", "CLASS_TYPE", "ROOMNUM") 
      VALUES (p_class, p_unitc, p_classd, p_classt, p_classtp, p_roomnm);
    END IF;

END;
    CREATE OR REPLACE PROCEDURE OPEN_CLASS(
               p_class IN TUTPRAC.CLASSID%TYPE,
               p_unitc IN TUTPRAC.UNITCODE%TYPE,
               p_classd IN TUTPRAC.CLASS_DAY%TYPE,
               p_classt IN TUTPRAC.CLASS_TIME%TYPE,
               p_classtp IN TUTPRAC.CLASS_TYPE%TYPE,
               p_roomnm IN TUTPRAC.ROOMNUM%TYPE)
        IS
        BEGIN

          INSERT INTO TUTPRAC ("CLASSID", "UNITCODE", "CLASS_DAY", "CLASS_TIME", "CLASS_TYPE", "ROOMNUM") 
INSERT INTO table
SELECT p_class, p_unitc, p_classd, p_classt, p_classtp, p_roomnm
  FROM dual 
 WHERE NOT EXISTS (SELECT NULL 
                     FROM TUTPRAC 
                    WHERE CLASSID = p_class and UNITCODE  = p_unitc and CLASS_DAY = p_classd and CLASS_TIME = p_classt and CLASS_TYPE = p_classtp and ROOMNUM = p_roomnm
                  )
你知道合并吗


我只是想尝试一下这个和上面的评论,我还想检查插入的类是否与UNITSTREAM表中的流讲座冲突。基本上,我所做的是确保输入到TUTPRAC表中的TUT或PRAC不会冲突或有任何重复项,也不会与自己的流讲座日/时间/房间冲突@拉胡尔Tripathi@CM25:-您可以尝试再创建一个变量,然后在表中签入,如SELECT nvlSELECT 1 FROM UNITSTREAM,其中CLASSID=p_class和UNITCODE=p_unitc,class_DAY=p_classd,class_TIME=p_classt和class_TYPE=p_classtp和ROOMNUM=p_roomnm,从双变量0到x;然后在IF条件下,您可以使用和条件检查两个变量的值是否都为1。当我输入您发送给我的第一个解决方案时,我出现了此错误=Error23,4:PLS-00103:在预期以下情况之一时遇到文件结尾符号:begin case declare end exception exit for goto IF loop mod null pragma raise return选择update while with有没有办法也从UNITSTREAMS表中检查TUTPRAC中的相同字段?UNITSTREAMS表包含相同单元的讲座,而TUTPRAC由TUTE和PRAC组成。所以我需要确保TUTE和PRAC也不会与存储在UNITSTREAM中的课程冲突@ArkadiuszŁukasiewicz此代码是否也会检测同一房间/时间/天内两个不同类之间的冲突?因此,如果周三下午6点45分在a房间有一堂数学课,而我们试图在同一时间和同一天在该房间增加一堂科学课,上面的代码是否会检测到这种冲突@阿卡迪乌斯·乌卡塞维茨