I'm trying to create a procedure. When I run my code I get the error:
21/1 PLS-00103: Encountered the symbol "EXCEPTION" when expecting one
of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
Perhaps it has to do with my BEGIN
and END
statements? I'm new to SQL and haven't been able to figure it out.
Here's my code:
CREATE OR REPLACE PROCEDURE inserttocasting(idofmovie IN casting.movieid%TYPE,
idofactor IN casting.actorid%TYPE,
newordinal IN casting.ordinal%TYPE)
IS
identical_ordinal EXCEPTION;
too_many_movies EXCEPTION;
BEGIN
SELECT cast_year(idofmovie) INTO v_year FROM dual;
IF ordinal_count(newordinal, idofmovie) >= 1 THEN
RAISE identical_ordinal;
ELSIF cast_count(v_year, idofactor) >= 3 THEN
RAISE too_many_movies;
ELSE
INSERT INTO casting (movieid, actorid, ordinal)
VALUES (idofmovie, idofactor, newordinal);
END IF;
EXCEPTION WHEN identical_ordinal THEN
dbms_output.PUT_LINE('Ordinal already exists for this film!');
EXCEPTION WHEN too_many_movies THEN
DBMS_OUTPUT.PUT_LINE('This actor has already been cast in more than three movies this year.');
COMMIT;
END;
/
Here is the code for the functions being used if necessary:
CREATE OR REPLACE FUNCTION ordinal_count(
newordinal IN CASTING.ORDINAL%TYPE, idofmovie IN CASTING.MOVIEID%TYPE
) RETURN NUMBER AS
p_ordinal_number NUMBER;
BEGIN
SELECT COUNT(ACTORID)
INTO p_ordinal_number
FROM CASTING
WHERE ORDINAL = newordinal
AND MOVIEID = idofmovie;
RETURN p_ordinal_number;
END ordinal_count;
/
CREATE OR REPLACE FUNCTION cast_year(idofmovie IN CASTING.MOVIEID%TYPE
) RETURN NUMBER AS
v_year NUMBER;
BEGIN
SELECT YEAR
INTO v_year
FROM MOVIE
WHERE MOVIEID = idofmovie;
RETURN v_year;
END cast_year;
/
CREATE OR REPLACE FUNCTION cast_count(v_year IN MOVIE.YEAR%TYPE, idofactor IN CASTING.ACTORID%TYPE
) RETURN NUMBER AS
v_count NUMBER;
BEGIN
SELECT COUNT(v_year)
INTO v_count
FROM CASTING
WHERE ACTORID = idofactor;
RETURN v_count;
END cast_count;
/