2016-08-08 2 views
-1

Я имею эту ошибку:ошибка в PL/SQL пакета тела

Error (42,22): PLS-00103: Обнаружен символ ")", когда ожидает одно из следующих действий: ток

I написали пакет с несколькими функциями и процедурами.

вот мой пакет:

-- specification -- 

CREATE OR REPLACE PACKAGE SUPERHERO_PACKAGE AS 

FUNCTION GET_FULL_SUPERHERONAME(V_SUPERHERONAME IN VARCHAR2) 
    RETURN VARCHAR2; 
PROCEDURE GET_SUPERHEROS(V_CITY IN VARCHAR2); 
PROCEDURE GET_ALL_VILLANS; 
FUNCTION GET_MAX_XP 
    RETURN NUMBER; 
FUNCTION GET_STRONGEST_SUPERHERO 
    RETURN VARCHAR2; 

END SUPERHERO_PACKAGE; 

-- body -- 

CREATE OR REPLACE PACKAGE BODY SUPERHERO_PACKAGE AS 

FUNCTION GET_FULL_SUPERHERONAME(V_SUPERHERONAME IN VARCHAR2) 
    RETURN VARCHAR2 AS 
     BEGIN 
      SELECT FIRST_NAME, LAST_NAME 
      INTO V_FNAME, V_LNAME 
      FROM SUPERHERO 
      WHERE SUPERHERO_NAME = V_SUPERHERONAME; 

      RETURN (V_FNAME || " " || V_LNAME); 
     END; 

PROCEDURE GET_SUPERHEROS(V_CITY IN VARCHAR2) IS 
      CURSOR JUSTICE_LEAGUE IS 
      SELECT SUPERHERO_NAME FROM SUPERHERO WHERE CITY = V_CITY; 
      LEAGUE_MEMBER JUSTICE_LEAGUE % ROWTYPE; 
     BEGIN 
      OPEN JUSTICE_LEAGUE; 
      LOOP 
       FETCH JUSTICE_LEAGUE INTO LEAGUE_MEMBER; 
       EXIT WHEN (JUSTICE_LEAGUE % NOTFOUND); 
       DBMS_OUTPUT.PUT_LINE(LEAGUE_MEMBER.NAME); 
      END LOOP; 
      CLOSE JUSTICE_LEAGUE; 
     END; 

PROCEDURE GET_ALL_VILLANS IS 
      CURSOR DARK_FORCE IS 
      SELECT VILLAN FROM SUPERHERO; 
      FORCE_MEMBER DARK_FORCE % ROWTYPE; 
     BEGIN 
      OPEN DARK_FORCE; 
      LOOP 
      FETCH DARK_FORCE INTO FORCE_MEMBER; 
      EXIT WHEN (DARK_FORCE % NOTFOUND); 
      DBMS_OUTPUT.PUT_LINE(FORCE_MEMBER.VILLAN); 
      END LOOP; 
      CLOSE DARK_FORCE; 
     END; 

FUNCTION GET_MAX_XP() 
    RETURN NUMBER AS 
     DECLARE 
      N_XP := 0; 
     BEGIN 
      SELECT MAX(XP) INTO N_XP FROM SUPERHERO; 
      RETURN N_XP; 
     END; 

FUNCTION GET_STRONGEST_SUPERHERO() 
    RETURN VARCHAR2 AS 
     DECLARE 
      V_NAME := 'DNA'; 
      V_FNAME := 'SWAYAM'; 
      V_LNAME := 'RAINA'; 
     BEGIN 
      SELECT SUPERHERO_NAME, FIRST_NAME, LAST_NAME 
      INTO V_NAME, V_FNAME, V_LNAME 
      FROM SUPERHERO 
      WHERE XP = GET_MAX_XP(); 
      RETURN (V_FNAME || " " || V_LNAME || " AKA " || V_NAME); 
     END; 

END SUPERHERO_PACKAGE; 
+0

Двойные кавычки предназначены для имен идентификаторов, одинарные кавычки предназначены для строковых литералов. Кроме того, ваши последние две функции имеют отклоненные ключевые слова 'declare'. Также заблокирован ваш замок;) –

ответ

0

Вы код полна ошибок. Пожалуйста, проверьте ниже исправления.

CREATE OR REPLACE PACKAGE SUPERHERO_PACKAGE 
AS 
    FUNCTION GET_FULL_SUPERHERONAME (V_SUPERHERONAME IN VARCHAR2) RETURN VARCHAR2; 

    PROCEDURE GET_SUPERHEROS (V_CITY IN VARCHAR2); 

    PROCEDURE GET_ALL_VILLANS; 

    FUNCTION GET_MAX_XP RETURN NUMBER; 

    FUNCTION GET_STRONGEST_SUPERHERO RETURN VARCHAR2; 
END SUPERHERO_PACKAGE; 

-- body -- 

CREATE OR REPLACE PACKAGE BODY SUPERHERO_PACKAGE 
AS 
    FUNCTION GET_FULL_SUPERHERONAME (V_SUPERHERONAME IN VARCHAR2) 
    RETURN VARCHAR2 AS 
    V_FNAME varchar2(1000); 
    V_LNAME varchar2(1000); 

    BEGIN 
     SELECT FIRST_NAME, LAST_NAME 
     INTO V_FNAME, V_LNAME 
     FROM SUPERHERO 
     WHERE SUPERHERO_NAME = V_SUPERHERONAME; 

     RETURN(V_FNAME||'--'||V_LNAME); 
    END; 

    PROCEDURE GET_SUPERHEROS (V_CITY IN VARCHAR2) 
    IS 
     CURSOR JUSTICE_LEAGUE(vr_city VARCHAR2) --- parameterized Query 
     IS 
     SELECT SUPERHERO_NAME 
      FROM SUPERHERO 
      WHERE CITY = vr_city; 

     LEAGUE_MEMBER JUSTICE_LEAGUE%ROWTYPE; 
    BEGIN 
     OPEN JUSTICE_LEAGUE(V_CITY); --This is the way to call. 

     LOOP 
     FETCH JUSTICE_LEAGUE INTO LEAGUE_MEMBER; 

     EXIT WHEN JUSTICE_LEAGUE%NOTFOUND; -- No brackets needed 

     DBMS_OUTPUT.PUT_LINE(LEAGUE_MEMBER.SUPERHERO_NAME); 

     END LOOP; 

     CLOSE JUSTICE_LEAGUE; 
    END; 

    PROCEDURE GET_ALL_VILLANS 
    IS 
     CURSOR DARK_FORCE 
     IS 
     SELECT VILLAN 
     FROM SUPERHERO; 

     FORCE_MEMBER DARK_FORCE%ROWTYPE; 
    BEGIN 
     OPEN DARK_FORCE; 

     LOOP 
     FETCH DARK_FORCE INTO FORCE_MEMBER; 

     EXIT WHEN DARK_FORCE%NOTFOUND; 

     DBMS_OUTPUT.PUT_LINE (FORCE_MEMBER.VILLAN); 

     END LOOP; 

     CLOSE DARK_FORCE; 
    END; 

    FUNCTION GET_MAX_XP 
     RETURN NUMBER 
    AS 
    N_XP number:= 0;   --Never use declare here 
    BEGIN 
     SELECT MAX (XP) INTO N_XP FROM SUPERHERO; 

     RETURN N_XP; 
    END; 

    FUNCTION GET_STRONGEST_SUPERHERO 
     RETURN VARCHAR2 
    AS 
     V_NAME varchar2(1000) := 'DNA';     --------Declaration Missing 
     V_FNAME varchar2(1000) := 'SWAYAM'; 
     V_LNAME varchar2(1000) := 'RAINA'; 
    BEGIN 
     SELECT SUPERHERO_NAME, FIRST_NAME, LAST_NAME 
     INTO V_NAME, V_FNAME, V_LNAME 
     FROM SUPERHERO 
     WHERE XP = (SELECT GET_MAX_XP() from dual); ----general practrice to call a function in where clause 

     RETURN (V_FNAME||' '||V_LNAME||'AKA'||V_NAME); --no double quotes 
    END; 
END SUPERHERO_PACKAGE; 
Смежные вопросы