oracle - 我的程序中不断出现错误,这些错误有助于添加新类(class),并在说明中提出了要求

标签 oracle stored-procedures plsql error-handling

该程序需要确保:

1.COURSE表中已经存在该类(class)的前提类(class)(如果有)。为简单起见,
我们将假装一门类(class)最多只能有一门类(class)为前提。

  • 类(class)的前提条件必须是较低级别。例如,ISYS326的前提条件必须是a100-200-级别的类(class),并且不能是300级别的类(class)。

  • 如果以上任一要求均失败,则该过程将引发异常WRONG_PREREQ,该异常会打印适当的警报消息,并且不会修改COURSE表。

    在过程CID =courseid PID=prerequisiteid and DID=deptid中,它们都是not null

    因此,此过程将用于进入新类(class)

    创建或替换过程NEW_COURSE(

    CID IN COURSE.COURSEID%TYPE,

    CNAME在COURSE.COURSENAME%TYPE中,

    PID输入HAS_PREREQUISITE.PREREQUISITEID%TYPE,

    DID IN DEPARTMENT.DEPTID%TYPE
    )



    CONDITION1 NUMBER;

    CONDITION2 NUMBER;

    WRONG_PREQ EXCEPTION;

    开始
    /*这可以在任何SQL之前检查*/

    如果(SUBSTR(CID,5,3)<= SUBSTR(PID,5,3))然后/* PREREQUISITE具有更高的ID

    比类(class)*/

    RAISE WRONG_PREQ;

    万一;

    SELECT COUNT(COURSEID)

    进入条件1

    从类(class)

    类(class)编号= PID;

    /*可以在这里检查,而无需运行第二个选择*/

    如果(条件1 <> 1)然后/违反条件1,则不存在
    必修类(class)/

    RAISE WRONG_PREQ;

    万一;

    选择计数(*)

    进入条件2

    来自HAS_PREREQUISITE

    类(class)编号= CID

    AND PREREQUISITEID = PID

    AND SUBSTR(CID,5,3)> SUBSTR(PID,5,3);

    如果(条件2 = 1)则/HAS_PREREQUISITE中已存在该记录
    表/

    RAISE WRONG_PREQ;

    万一;

    插入类(class)值(CID,CNAME,'NULL','NULL');

    插入HAS_PREREQUISITE值(CID,PID);

    插入部门值(DEPTID,'NULL');

    异常(exception)

    当WRONG_PREQ然后

    DBMS_OUTPUT.PUT_LINE('COURSEID或PREREQUISITE ID无效');

    END NEW_COURSE;

    这是由Oracle SQL Developer完成的。

    DDL

    /================================================== ============/

    /* DBMS名称:ORACLE版本11g */

    /*创建于:2016年11月10日下午3:47:29 */

    /================================================= ============/

    更改表格Academic_REC
    掉落约束FK_ACADEMIC_RELATIONS_STUDENT;

    修改表Academic_REC
    掉落约束FK_ACADEMIC_RELATIONS_COURSE;

    变更表COURSE
    掉落约束FK_COURSE_OFFERS_DEPARTME;

    变更表ENROLS
    掉落约束FK_ENROLS_ENROLS_STUDENT;

    变更表ENROLS
    掉落约束FK_ENROLS_ENROLS2_TUT_PRAC;

    修改表HAS_PREREQUISITE
    掉落约束FK_HAS_PRER_HAS_PRERE_COURSE;

    修改表HAS_PREREQUISITE
    掉落约束FK_HAS_PRER_HAS_PRERE_COURSE;

    修改表STAFF
    掉落约束FK_STAFF_RELATIONS_DEPARTME;

    修改表TEACHING_INFORMATION
    掉落约束FK_TEACHING_RELATIONS_STAFF;

    修改表TEACHING_INFORMATION
    掉落约束FK_TEACHING_RELATIONS_COURSE;

    修改表TUT_PRAC
    掉落约束FK_TUT_PRAC_HAS_COURSE;

    修改表TUT_PRAC
    掉落约束FK_TUT_PRAC_RELATIONS_STAFF;

    删除表Academic_REC级联约束;

    删除表COURSE级联约束;

    删除表ENROLS级联约束;

    删除表HAS_PREREQUISITE级联约束;

    删除表STAFF的级联约束;

    删除表STUDENT的级联约束;

    删除表TEACHING_INFORMATION级联约束;

    删除表TUT_PRAC级联约束;

    /================================================= ============/

    /*表:Academic_REC */

    /================================================= ============/

    创建表格Academic_REC

    (

    STUID CHAR(8)不为null,

    COURSEID CHAR(8)不为null,

    状态VARCHAR2(5),

    年数(4),

    半字符(2),

    等级VARCHAR2(2)

    约束CKC_GRADE_ACADEMIC检查(GRADE为空或(GRADE在

    ('HD','D','CR','P','F'))),

    约束PK_ACADEMIC_REC主键(STUID,COURSEID)
    );

    /================================================= ============/

    /*表:COURSE */

    /================================================= ============/

    创建表COURSE

    (

    COURSEID CHAR(8)不为null,

    DEPTID CHAR(8)不为null,

    COURSENAME VARCHAR2(20),

    TEXTBOOK VARCHAR2(20),

    密码(2),

    MAX_ENROL NUMBER(4),

    ACTUAL_ENROL NUMBER(4),

    空房数(4),

    COURSE_TIME CHAR(7),

    约束PK_COURSE主键(COURSEID)
    );

    /================================================= ============/

    /*表:部门*/

    /================================================= ============/

    创建表DEPARTMENT
    (

    DEPTID CHAR(8)不为null,

    DEPTNAME VARCHAR2(20),

    DEPTCONTACTNO编号(10),

    构建VARCHAR2(5),

    约束PK_DEPARTMENT主键(DEPTID)

    );

    /================================================= ============/

    /*表:ENROLS */

    /================================================= ============/

    创建表ENROLS
    (

    STUID CHAR(8)不为null,

    CLASSID CHAR(8)不为null,

    约束PK_ENROLS主键(STUID,CLASSID)
    );

    /================================================= ============/

    /*表:HAS_PREREQUISITE */

    /================================================= ============/

    创建表HAS_PREREQUISITE
    (

    COURSEID CHAR(8)不为null,

    PREREQUISITEID CHAR(8)不为null,

    约束PK_HAS_PREREQUISITE主键(COURSEID,PREREQUISITEID)
    );

    /================================================= ============/

    /*表:STAFF */

    /================================================= ============/

    创建表STAFF
    (

    STAFFID CHAR(8)不为null,

    DEPARTMENTID CHAR(8)不为null,

    STAFFNAME VARCHAR2(50),

    STAFFADDRESS VARCHAR2(70),

    工作人员联系人编号(10),

    工作人员VARCHAR2(50),

    办事处编号(5),

    角色VARCHAR2(10),

    约束PK_STAFF主键(STAFFID)
    );

    /================================================= ============/

    /*表格:学生*/

    /================================================= ============/

    创建表STUDENT
    (

    STUID CHAR(8)不为null,

    度VARCHAR2(10),

    主要VARCHAR2(10),

    STU_NAME VARCHAR2(50),

    STU_ADDRESS VARCHAR2(70),

    联系人号码(10),

    电子邮件VARCHAR2(50),

    约束PK_STUDENT主键(STUID)
    );

    /================================================== ============/

    /*表:TEACHING_INFORMATION */

    /================================================= ============/

    创建表TEACHING_INFORMATION
    (

    STAFFID CHAR(8)不为null,

    COURSEID CHAR(8)不为null,

    SEMESTER CHAR(2)不为null,

    YEAR NUMBER(4)不为空,

    约束PK_TEACHING_INFORMATION主键(STAFFID,COURSEID,SEMESTER,YEAR)
    );

    /================================================= ============/

    /*表:TUT_PRAC */

    /================================================= ============/

    创建表TUT_PRAC
    (

    CLASSID CHAR(8)不为null,

    COURSEID CHAR(8)不为null,

    STAFFID CHAR(8)不为null,

    类型VARCHAR2(5),

    DAY VARCHAR2(10),

    TIME DATE,

    ROOMID CHAR(10),

    NO_OF_SEATS NUMBER(2),

    约束PK_TUT_PRAC主键(CLASSID)
    );

    更改表格Academic_REC
    添加约束FK_ACADEMIC_RELATIONS_STUDENT外键(STUID)
    引用学生(STUID);

    更改表格Academic_REC
    添加约束FK_ACADEMIC_RELATIONS_COURSE外键(COURSEID)
    引用COURSE(COURSEID);

    变更表COURSE
    添加约束FK_COURSE_OFFERS_DEPARTME外键(DEPTID)
    引用部门(DEPTID);

    变更表ENROLS
    添加约束FK_ENROLS_ENROLS_STUDENT外键(STUID)
    引用学生(STUID);

    变更表ENROLS
    添加约束FK_ENROLS_ENROLS2_TUT_PRAC外键(CLASSID)
    引用TUT_PRAC(CLASSID);

    修改表HAS_PREREQUISITE
    添加约束FK_HAS_PRER_HAS_PRERE_COURSE外键(COURSEID)
    引用COURSE(COURSEID);

    修改表HAS_PREREQUISITE
    添加约束FK_HAS_PRER_HAS_PRERE_COURSE外键(PREREQUISITEID)
    引用COURSE(COURSEID);

    修改表STAFF
    添加约束FK_STAFF_RELATIONS_DEPARTME外键(DEPARTMENTID)
    引用部门(DEPTID);

    修改表TEACHING_INFORMATION
    添加约束FK_TEACHING_RELATIONS_STAFF外键(STAFFID)
    引用STAFF(STAFFID);

    修改表TEACHING_INFORMATION
    添加约束FK_TEACHING_RELATIONS_COURSE外键(COURSEID)
    引用COURSE(COURSEID);

    修改表TUT_PRAC
    添加约束FK_TUT_PRAC_HAS_COURSE外键(COURSEID)
    引用COURSE(COURSEID);

    修改表TUT_PRAC

    添加约束FK_TUT_PRAC_RELATIONS_STAFF外键(STAFFID)
    引用STAFF(STAFFID);

    最佳答案

    好吧,你有明确的错误信息。全部与下表有关:

    第一个表说not enough values。这意味着您尝试插入的值比表中的列少

    INSERT INTO COURSE VALUES(CID,CNAME,'NULL','NULL' );
    -- Error(29,3): PL/SQL: SQL Statement ignored Error(29,15): PL/SQL: ORA-00947: not enough values 
    You may add values or specify a columns for instance `INSERT INTO COURSE (course_id, course_name, val1, val2 ) VALUES(CID,CNAME,'NULL','NULL' );`
    

    下一个;
    INSERT INTO HAS_PREREQUISITE VALUES(CID,PID,'NULL','NULL');
    -- Error(30,3): PL/SQL: SQL Statement ignored Error(30,15): PL/SQL: ORA-00913: too many values 
    

    也很清楚。表HAS_PREREQUISITE的列较少,然后您尝试插入。删除多余的值
    INSERT INTO DEPARTMENT VALUES (DEPTID,'NULL');
    -- Error(31,3): PL/SQL: SQL Statement ignored Error(31,15): PL/SQL: ORA-00947: not enough values
    

    与第一个示例相同。

    关于oracle - 我的程序中不断出现错误,这些错误有助于添加新类(class),并在说明中提出了要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40233768/

    相关文章:

    sql-server - 从 Azure 弹性数据库作业读取 Oracle 数据库

    sql - Oracle APEX : Error: SyntaxError: Unexpected end of JSON input

    Java Hibernate C3P0存储过程命名查询错误-语句关闭后不允许进行操作,无法释放JDBC连接

    sql - 找出 PL/SQL 脚本在等待什么

    oracle - 如何同时运行两个或多个 Oracle 作业实例?

    sql - 按照LINK中的代码后PL/SQL MENU疑惑

    oracle - 基于函数的索引和 user_tab_cols

    SQL错误: ORA-01732: data manipulation operation not legal on this view

    mysql - 调用存储过程对数组执行计数

    c# - 返回所有包含特定值的列名