【问题标题】:SQL - Encountered the symbol "EXCEPTION" when expecting one of the followingSQL - 在预期以下情况之一时遇到符号“例外”
【发布时间】:2015-03-12 23:56:10
【问题描述】:

我正在尝试创建一个程序。当我运行我的代码时,我得到了错误:

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

也许这与我的BEGINEND 语句有关?我是 SQL 新手,一直没弄明白。

这是我的代码:

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;
/

如果需要,这里是正在使用的函数的代码:

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;
/

【问题讨论】:

    标签: sql oracle stored-procedures plsql pls-00103


    【解决方案1】:

    将您的第一个程序更改为:

    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);
    
        COMMIT;
      END IF;
    EXCEPTION
      WHEN identical_ordinal THEN
        DBMS_OUTPUT.PUT_LINE('Ordinal already exists for this film!');
      WHEN too_many_movies THEN
        DBMS_OUTPUT.PUT_LINE('This actor has already been cast in more than three movies this year.');
    END;
    

    您可以将多个 WHEN 块放入单个 EXCEPTION 处理程序中。此外,当我怀疑您希望它遵循 INSERT 时,您在 WHEN too_many_movies... 处理程序的末尾有 COMMIT 语句。它的定位方式只有在输入 too_many_movies 处理程序时才会执行,这似乎没有意义。

    并且...使用空格,卢克... :-)

    分享和享受。

    【讨论】:

    • 非常感谢您的帮助!这看起来好多了,除了我现在收到错误:10/6 PLS-00201: identifier 'V_YEAR' must be declared 我没有在 BEGIN 语句下正确地将我的函数存储到 v_year 中吗?
    • 您没有在 insertToCasting 过程中声明名为 v_year 的变量。尝试在声明部分添加一个。另外,现在看了,建议把SELECT cast_year(idofmovie) INTO v_year FROM dual换成v_year := cast_year(idofmovie),这样更短更容易理解。
    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2014-09-18
    • 2012-10-26
    相关资源
    最近更新 更多