2016-03-30 3 views
0

Я пытаюсь создать пакет, который позволит мне вставлять оценки в таблицу. У преподавателей есть определенные классы, которые они учат, и я хочу сделать исключение, когда учитель хочет поставить класс в класс, который они не учат. Это мой код:Ошибка создания пакета

CREATE OR REPLACE PACKAGE manager_facultate IS 
    PROCEDURE inserare_nota (nr_matr studenti.nr_matricol%type, nume profesori.nume%type, id_curs note.id_curs%type, valoarea note.valoare%type); 
END manager_facultate; 
/

CREATE OR REPLACE PACKAGE BODY manager_facultate IS 

    FUNCTION returneaza_id_curs (id_curs NUMBER) RETURN NUMBER IS 
    BEGIN 
     CURSOR c1 (nume) IS 
      SELECT d.id_curs from didactic d JOIN profesori p ON d.id_prof=p.id_prof 
      WHERE p.nume=nume; 
    END returneaza_id_curs; 

    PROCEDURE inserare_nota (nr_matr studenti.nr_matricol%type, nume profesori.nume%type, id_curs note.id_curs%type, valoarea note.valoare%type) IS 
    v_id NUMBER(3); 
    BEGIN 
    INSERT INTO note VALUES (nr_matr, id_curs, valoare, NULL); 
    EXCEPTION 
    WHEN id_gresit THEN 
     v_id :=returneaza_id_curs(nume); 
     IF id_curs <> v_id THEN 
      raise_application_error (-20002, 'Profesorul nu preda acest curs'); 
     END IF; 
    END inserare_nota; 

END manager_facultate; 
/

Я получаю эту ошибку, когда я хочу создать пакет тела.

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
5/16  PLS-00103: Encountered the symbol "C1" when expecting one of the 
     following: 
     := . (@ % ; 
     The symbol ":=" was substituted for "C1" to continue. 

6/12  PLS-00103: Encountered the symbol "SELECT" when expecting one of 
     the following: 
     not null of nan infinite dangling a empty 

6/45  PLS-00103: Encountered the symbol "JOIN" when expecting one of 
     the following: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
     , ; for group having intersect minus order start union where 
     connect 

Что я сделал не так?

+0

Ваша функция 'returneaza_id_curs' не то, что для меня ясно; учитывая, что это должно быть написано как «FUNCTION returneaza_id_curs ... IS CURSOR c1 (num NUMBER) IS ... BEGIN ... END returneaza_id_curs;' ответ - что он должен делать; он утверждает, что возвращает номер, но у вас нет возвращаемого значения, так что должна делать эта функция? – Aleksej

+0

Оператор CURSOR C1 должен находиться в части декларации перед BEGIN. Вы можете взглянуть на этот пример: http://www.techonthenet.com/oracle/cursors/declare.php. –

+0

является его лучше 'FUNCTION returneaza_id_curs (NUME VARCHAR2) ВОЗВРАТ НОМЕР КУРСОРОМ с1 (NUME) IS SELECT, d.id_curs из дидактических д РЕГИСТРИРУЙТЕСЬ profesori р = О d.id_prof p.id_prof ГДЕ p.nume = Nume; v_id NUMBER (3); BEGIN open c1; LOOP выборка c1 (nume) в v_id; выход, когда c1% notfound; END LOOP; RETURN v_id; END returneaza_id_curs; ' – katy

ответ

0

Вы не должны процедуру, если у вас есть соответствующие таблицы и внешние ключи на них:

CREATE TABLE People (
    ID   INT PRIMARY KEY, 
    First_Name VARCHAR2(100), 
    Last_Name VARCHAR2(100) 
); 

CREATE TABLE Students(
    ID    INT PRIMARY KEY REFERENCES People(ID), 
    Enrollment_Date DATE 
); 

CREATE TABLE Staff(
    ID  INT PRIMARY KEY REFERENCES People(ID), 
    Salary NUMBER, 
    Office VARCHAR2(10) 
); 

CREATE TABLE Courses(
    ID  INT PRIMARY KEY, 
    Title VARCHAR2(50) 
); 

CREATE TABLE Course_Teachers(
    ProfessorID INT REFERENCES Staff(ID), 
    CourseID INT REFERENCES Courses(ID), 
    Class_Name VARCHAR2(50), 
    PRIMARY KEY (ProfessorID, CourseID) 
); 

CREATE TABLE Enrollments(
    ProfessorID INT, 
    CourseID INT, 
    StudentID INT REFERENCES Students (ID), 
    FOREIGN KEY (ProfessorID, CourseID) REFERENCES Course_Teachers (ProfessorID, CourseID), 
    PRIMARY KEY (ProfessorID, CourseID, StudentID) 
); 

CREATE TABLE Assignments(
    ProfessorID  INT REFERENCES Staff(ID), 
    CourseID   INT REFERENCES Courses(ID), 
    AssignmentNumber INT, 
    GradePercentage INT, 
    Name    VARCHAR2(50), 
    FOREIGN KEY (ProfessorID, CourseID) REFERENCES Course_Teachers (ProfessorID, CourseID), 
    PRIMARY KEY (ProfessorID, CourseID, AssignmentNumber) 
); 

CREATE TABLE Grades(
    ProfessorID  INT REFERENCES Staff(ID), 
    CourseID   INT REFERENCES Courses(ID), 
    StudentID  INT REFERENCES Students (ID), 
    AssignmentNumber INT, 
    Grade   INT, 
    FOREIGN KEY (ProfessorID, CourseID, StudentID) REFERENCES Enrollments (ProfessorID, CourseID, StudentID), 
    FOREIGN KEY (ProfessorID, CourseID, AssignmentNumber) REFERENCES Assignments (ProfessorID, CourseID, AssignmentNumber), 
    PRIMARY KEY (ProfessorID, CourseID, StudentID, AssignmentNumber) 
); 
Смежные вопросы