2013-04-16 3 views
3

Я пытаюсь создать пакет с четырьмя функциями. Каждая функция добавляет набор чисел и вычитает один из общего числа. У меня возникли проблемы с правилом синтаксиса. Функции ниже работают сами по себе, и я пытаюсь вызвать первую функцию в конце.Функция/выпуск пакета PL/SQL

Когда я пытаюсь создать пакет я получаю сообщение об ошибке, где в строке 7, «Столкнутый символ„END“, когда ожидает один из следующих действий: начать функцию процедура Прагмы типа подтипа текущего курсор удаление существует до 0.05 секунды»

В корпусе упаковки указано, что «имя уже используется существующим объектом». Я не понимаю, как это должно быть объявлено в спецификации пакета в любом случае, и создание или замена должно решить это, если ошибка в том, что уже есть пакет с именем functionbyfour.

И, наконец, когда я пытаюсь использовать функцию в пакете, он говорит: «Обнаружен символ« BEGIN », если вы ожидаете одно из следующего:: =. (@%; Не нулевой диапазон по умолчанию символ Символ«; «заменяли« BEGIN »на продолжение. ORA-06550: строка 5, столбец 43: PLS-00103: встретил символ« ОТ », если ожидал одно из следующего:. (*% & = - +; < /> at в это мода остаток не РЗМ <> или! = или ~ => = < < => и или как Нравится2 like4 likec между || мультимножества меня».

Я использую ORACLE Express Edition 11g и новичок в PL/SQL (4 недели).

Любой вход очень приветствуется.

CREATE OR REPLACE FUNCTION functionbyfour AS 

FUNCTION functone(first number, second number) RETURN NUMBER ; 
FUNCTION functtwo(first number, second number, third number) RETURN NUMBER ; 
FUNCTION functthree(first number, second number, third number, fourth number) RETURN  NUMBER ; 
FUNCTION functfour(first number, second number, third number, fourth number,fifth number) RETURN NUMBER ; 

END functionbyfour; 
/

CREATE OR REPLACE PACKAGE functionbyfour AS 

FUNCTION functone (first number, second number) RETURN number AS total number; 
BEGIN 
total:=first + second – 1; 
RETURN total; 
DBMS_OUTPUT.PUT_LINE(total); 
END functone; 


FUNCTION functtwo (first number, second number, third number) RETURN number AS total  number; 
BEGIN 
total:=first + second + third – 1; 
RETURN total; 
DBMS_OUTPUT.PUT_LINE(total); 
END functtwo; 

FUNCTION functthree (first number, second number,third number, fourth number)  RETURN  number AS total number; 
BEGIN 
total:=first + second + third + fourth – 1; 
RETURN total; 
DBMS_OUTPUT.PUT_LINE(total); 
END functthree; 


FUNCTION functfour (first number, second number, third number, fourth number, fifth  number) RETURN number AS total number; 
BEGIN 
total:=first + second + third + fourth + fifth – 1; 
RETURN total; 
DBMS_OUTPUT.PUT_LINE(total); 
END functfour; 

/

BEGIN 

SELECT functionbyfour.functone(1,2) FROM DUAL; 

END; 

/

ответ

8

Вы должны создать пакет с именем FunctionByFour (CREATE OR REPLACE PACKAGE)

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE PACKAGE functionbyfour AS 
    2 FUNCTION functone(first number, second number) RETURN NUMBER ; 
    3 FUNCTION functtwo(first number, second number, third number) RETURN NUMBER ; 
    4 FUNCTION functthree(first number, second number, third number, fourth number) RETURN  NUMBER ; 
    5 FUNCTION functfour(first number, second number, third number, fourth number,fifth number) RETURN NUMBER ; 
    6* END functionbyfour; 
    7/

Package created. 

, а затем соответствующее тело пакета (CREATE OR REPLACE PACKAGE BODY).Вы также будете нуждаться в END для тела пакета (прямо сейчас, ваш код заканчивается в конце четвертой функции)

SQL> ed 
Wrote file afiedt.buf 

    1 CREATE OR REPLACE PACKAGE BODY functionbyfour AS 
    2 FUNCTION functone (first number, second number) RETURN number AS total number; 
    3 BEGIN 
    4  total:=first + second - 1; 
    5  RETURN total; 
    6  DBMS_OUTPUT.PUT_LINE(total); 
    7 END functone; 
    8 FUNCTION functtwo (first number, second number, third number) RETURN number AS total  number; 
    9 BEGIN 
10  total:=first + second + third - 1; 
11  RETURN total; 
12  DBMS_OUTPUT.PUT_LINE(total); 
13 END functtwo; 
14 FUNCTION functthree (first number, second number,third number, fourth number)  RETURN  number AS total number; 
15 BEGIN 
16  total:=first + second + third + fourth - 1; 
17  RETURN total; 
18  DBMS_OUTPUT.PUT_LINE(total); 
19 END functthree; 
20 FUNCTION functfour (first number, second number, third number, fourth number, fifth  number) RETURN number AS total number; 
21 BEGIN 
22  total:=first + second + third + fourth + fifth - 1; 
23  RETURN total; 
24  DBMS_OUTPUT.PUT_LINE(total); 
25 END functfour; 
26* END functionbyfour; 
SQL>/

Package body created. 

После того, как вы сделали это, вы можете использовать функцию

SQL> SELECT functionbyfour.functone(1,2) FROM DUAL; 

FUNCTIONBYFOUR.FUNCTONE(1,2) 
---------------------------- 
          2 

Если вы хотите поставить оператор SELECT в блок PL/SQL, вам нужно будет объявить локальную переменную и сделать SELECT INTO, чтобы заполнить локальную переменную с результатом функции (вы также можете просто назначить локальную переменную результат вызова функции без необходимости использования SELECT).

SQL> ed 
Wrote file afiedt.buf 

    1 DECLARE 
    2 l_result NUMBER; 
    3 BEGIN 
    4 -- First approach 
    5 l_result := functionByFour.functOne(1,2); 
    6 dbms_output.put_line(l_result); 
    7 -- Second approach 
    8 SELECT functionByFour.functOne(1,2) 
    9  INTO l_result 
10  FROM dual; 
11 dbms_output.put_line(l_result); 
12* END; 
13/
2 
2 

PL/SQL procedure successfully completed. 

Также следует помнить, что помещение DBMS_OUTPUT.PUT_LINE после RETURN заявление не имеет смысла. Этот код никогда не может быть достигнут. Если вы хотите напечатать результат в буфере DBMS_OUTPUT, это должно было пройти до RETURN.

3

Вы запутались автономных программ и пакетов.

CREATE FUNCTION может использоваться только для создания автономного функционала. То, что у вас есть, должно быть:

CREATE OR REPLACE PACKAGE functionbyfour AS 

Пакет состоит из двух частей, спецификации и корпуса. Спецификация является публичным лицом API, тело - это реализация. То, что у вас есть в качестве пакета (spec), является корпусом пакета. Поэтому измените этот второй кусок кода, чтобы начать

CREATE OR REPLACE PACKAGE BODY functionbyfour AS 

и по крайней мере у вас будет правильно структурирована ваша программа.

Документация Oracle PL/SQL находится в режиме онлайн, comnprehensive и бесплатно. Я призываю вас прочитать его. Find out more.

4
  1. Линия

    CREATE OR REPLACE FUNCTION functionbyfour AS 
    

    должно быть

    CREATE OR REPLACE PACKAGE functionbyfour AS 
    
  2. Линия

    CREATE OR REPLACE PACKAGE functionbyfour AS 
    

    должно быть

    CREATE OR REPLACE PACKAGE BODY functionbyfour AS 
    
  3. Слово второе является ключевым словом, и вы не можете использовать его в качестве имени параметра

  4. Вам нужен

    END functionbyfour; 
    

    После вашего END functfour чтобы закончить тело пакета

  5. Ваши данные dbms_output никогда не будут выполнены, как после возврата

  6. Вы можете делать все это в одной функции

    FUNCTION functall(FIRST NUMBER 
            ,sec NUMBER DEFAULT 0 
            ,third NUMBER DEFAULT 0 
            ,fourth NUMBER DEFAULT 0 
            ,fifth NUMBER DEFAULT 0) 
        RETURN NUMBER 
    AS 
        total NUMBER; 
    BEGIN 
        total := first + sec + third + fourth + fifth - 1; 
    
        dbms_output.PUT_LINE(total); 
    
        RETURN total; 
    END functall; 
    
  7. Какая странная вещь хотят сделать? :-)

+0

спасибо за ввод, не уверен, что во втором ключевое слово (его не подсвечивают и, похоже, работают). Это задание, кто знает, что проходит через ум профессора? Ваш код кажется легким, но он сказал, что хочет пакет с четырьмя функциями, поэтому я не буду спорить с ним. –

+0

Да, когда я сказал «не могу», я должен был сказать «не должен», если вы включили предупреждения plsql и проверили ошибки пользователя, вы получите предупреждение PLW-06010: ключевое слово «SECOND» используется как определенное имя – Dave

Смежные вопросы