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
Что я сделал не так?
Ваша функция 'returneaza_id_curs' не то, что для меня ясно; учитывая, что это должно быть написано как «FUNCTION returneaza_id_curs ... IS CURSOR c1 (num NUMBER) IS ... BEGIN ... END returneaza_id_curs;' ответ - что он должен делать; он утверждает, что возвращает номер, но у вас нет возвращаемого значения, так что должна делать эта функция? – Aleksej
Оператор CURSOR C1 должен находиться в части декларации перед BEGIN. Вы можете взглянуть на этот пример: http://www.techonthenet.com/oracle/cursors/declare.php. –
является его лучше '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