该程序需要确保:
1.COURSE表中已经存在该类(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/