我正在尝试编写一个按学生ID,课程编号和部分ID注册课程的程序。 我必须在注册之前检查课程的可用性。
下面是我的程序,没有错误但没有注册..
SET SERVEROUTPUT ON SIZE 4000
CREATE OR REPLACE PROCEDURE ADD_COURSE ( Sid IN VARCHAR2, courseNo IN VARCHAR2,secNum IN NUMBER)
IS
stat VARCHAR2(20);
CSecID NUMBER(6);
TiD NUMBER(6);
BEGIN
SELECT c_sec_id, term_id into CSecID, TiD FROM COURSE_SECTION
where course_no=courseNo and sec_num=secNum;
SELECT status into stat FROM TERM where term_id=TiD;
IF stat = 'OPEN' THEN
INSERT INTO enrollment(s_id, c_sec_id, grade) VALUES(Sid, CSecID, NULL);
END IF;
END;
/
BEGIN
ADD_COURSE('122487', 'ITCS490', 1);
END;
/
表和插入
CREATE TABLE TERM
(term_id NUMBER(6),
term_desc VARCHAR2(20),
status VARCHAR2(20),
start_date DATE,
CONSTRAINT term_term_id_pk PRIMARY KEY (term_id),
CONSTRAINT term_status_cc CHECK ((status = 'OPEN') OR (status = 'CLOSED')));
--- inserting records into TERM
INSERT INTO term (term_id, term_desc, status) VALUES
(1, 'Spring 2014', 'CLOSED');
INSERT INTO term (term_id, term_desc, status) VALUES
(2, 'Summer 2014', 'CLOSED');
INSERT INTO term (term_id, term_desc, status) VALUES
(3, 'Summer 2015', 'OPEN');
CREATE TABLE COURSE_SECTION
(c_sec_id NUMBER(6),
course_no VARCHAR2(7) CONSTRAINT course_section_courseid_nn NOT NULL,
term_id NUMBER(6) CONSTRAINT course_section_termid_nn NOT NULL,
sec_num NUMBER(2) CONSTRAINT course_section_secnum_nn NOT NULL,
f_id NUMBER(6),
c_sec_day VARCHAR2(10),
c_sec_time DATE,
c_sec_duration INTERVAL DAY TO SECOND,
loc_id NUMBER(6),
max_enrl NUMBER(4) CONSTRAINT course_section_maxenrl_nn NOT NULL,
CONSTRAINT course_section_csec_id_pk PRIMARY KEY (c_sec_id),
CONSTRAINT course_section_cid_fk FOREIGN KEY (course_no) REFERENCES course(course_no),
CONSTRAINT course_section_loc_id_fk FOREIGN KEY (loc_id) REFERENCES location(loc_id),
CONSTRAINT course_section_termid_fk FOREIGN KEY (term_id) REFERENCES term(term_id),
CONSTRAINT course_section_fid_fk FOREIGN KEY (f_id) REFERENCES faculty(f_id));
--- inserting records into COURSE_SECTION
INSERT INTO course_section VALUES
(1, 'ITCS101', 3, 1, 1, 'UTH', TO_DATE('10:00 AM', 'HH:MI AM'), TO_DSINTERVAL('0 00:00:50.00'), 2, 30 );
INSERT INTO course_section VALUES
(2, 'ITCS101', 3, 2, 1, 'MW', TO_DATE('09:30 AM', 'HH:MI AM'), TO_DSINTERVAL('0 00:01:15.00'), 7, 35);
INSERT INTO course_section VALUES
(3, 'ITCS102', 3, 1, 2, 'UTH', TO_DATE('8:00 AM', 'HH:MI AM'), TO_DSINTERVAL('0 00:00:50.00'), 4, 30);
INSERT INTO course_section VALUES
(4, 'ITCS215', 3, 1, 2, 'UTH', TO_DATE('8:00 AM', 'HH:MI AM'), TO_DSINTERVAL('0 00:00:50.00'), 1, 30);
INSERT INTO course_section VALUES
(5, 'ITCS490', 1, 1, 3, 'UTH', TO_DATE('10:00 AM', 'HH:MI AM'), TO_DSINTERVAL('0 00:00:50.00'), 5,30 );
INSERT INTO course_section VALUES
(6, 'ITCS385', 1, 1, 1, 'UTH', TO_DATE('11:00 AM', 'HH:MI AM'), TO_DSINTERVAL('0 00:00:50.00'), 6,30 );
答案 0 :(得分:1)
您的数据有:
INSERT INTO course_section VALUES
(5, 'ITCS490', 1, 1, 3, 'UTH', TO_DATE('10:00 AM', 'HH:MI AM'), TO_DSINTERVAL('0 00:00:50.00'), 5,30 );
您正在使用courseNo => 'ITCS490'
和secNum => 1
调用该程序。
这意味着程序中的第一个查询得到:
SELECT c_sec_id, term_id FROM COURSE_SECTION where course_no='ITCS490' and sec_num=1;
C_SEC_ID TERM_ID
---------- ----------
5 1
第1项已结束:
SELECT status FROM TERM where term_id=1;
STATUS
--------------------
CLOSED
所以你的插入没有被正确调用。
您可以通过在程序中添加一些调试代码来验证程序中的值:
dbms_output.put_line('CSecID=' || CSecID || ', TiD=' || TiD || ', stat=' || stat);
然后当你打电话时,你会看到:
PL/SQL procedure successfully completed.
CSecID=5, TiD=1, stat=CLOSED
您的程序插入了不同的输入值;
BEGIN
ADD_COURSE('122487', 'ITCS102', 1);
END;
/
PL/SQL procedure successfully completed.
CSecID=3, TiD=3, stat=OPEN
select * from enrollment;
S_ID C_SEC_ID GRADE
---------- ---------- ----------
122487 3