2016-03-30 9 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 ... 'と書かれているので、 CURSOR c1(nume NUMBER)は... BEGIN ... END returneaza_id_curs;'、それは何をすべきかです。それは数値を返すと主張しますが、戻り値がないので、この関数は何をしますか? – Aleksej

+0

CURSOR C1ステートメントは、BEGINより前の宣言部にある必要があります。あなたはこの例を見ることができます:http://www.techonthenet.com/oracle/cursors/declare.php。 –

+0

が良い今 '関数のreturneaza_id_curs(ヌメVARCHAR2)RETURN番号 カーソルC1(ヌメ)は教則Dから SELECT d.id_curs JOIN profesori P上d.id_prof = p.id_prof p.nume =ヌメIS ISことです。 v_id NUMBER(3); BEGIN open c1; LOOP v1にc1(nume)をフェッチします。 終了時に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) 
); 
関連する問題