2015-10-04 2 views
0

Приведенный ниже код сохраняется в файле с именем proc1.sqlВызов одной процедуры из другой процедуры

DECLARE 
    B VARCHAR2(25); 
    C NUMBER; 

PROCEDURE Get_manager_detailS(NO IN NUMBER,NAME OUT VARCHAR2,SAL1 OUT NUMBER) 
IS 
BEGIN 
    SELECT ENAME, SAL 
    INTO NAME, SAL1 
    FROM EMP 
    WHERE EMPNO = NO; 
END; 
BEGIN 
Get_manager_detailS(7900,B,C); 
DBMS_OUTPUT.PUT_LINE(B); 
DBMS_OUTPUT.PUT_LINE(C); 
END; 
/

Эта процедура хранится в другом файле proc3.sql

PROCEDURE Test_Procedure() 
IS 
BEGIN 
b varchar2(25); 
c number; 
DBMS_OUTPUT.PUT_LINE('CALLING'); 
Get_manager_details(7900,b,c); 
END; 

Когда я бегу его в sqlplus, отображается ошибка

SP2-0734 НЕИЗВЕСТНАЯ КОМИССИЯ ПО НАЧАЛУ РАБОТЫ .. ОТДЫХ НА ЛИНИИ НЕПРАВИЛЬНО. SP2-0042 НЕИЗВЕСТНАЯ КОМАНДА «ЕСТЬ» .. РЕЗУЛЬТАТЫ ЛИНИИ НЕПРАВИЛЬНО.

ответ

1

Ваш первый блок - это анонимный блок, в котором вы объявляете процедуру - вы можете вызывать процедуру Get_manager_details только в анонимном блоке. Вы не можете позвонить Get_manager_details с Test_Procedure, потому что такой процедуры нет. Вы должны создать свой порядок Get_manager_details первый

Create or replace procedure Get_manager_details .... 

Затем вы можете запустить

Create or replace procedure Test_Procedure .... 

Или это не будет компилироваться.

-1

Если вы пытаетесь вызвать процедуру get_manager_details внутри test_procedure, сначала вам нужно создать процедуру тестирования. Добавить процедуру создания или замены процедуры test_procedure. Затем после создания test_procedure вы можете выполнить его в анонимном блоке, который вызовет процедуру get_manager_details.

2

Создание PROCEDURE/FUNCTION против Анонимного BLOCK

  • хранимых процедур/функций всегда начинается с CREATE OR REPLACE ... и заканчивается END;

    CREATE OR REPLACE служит неявным заявляют хранимые процедуры и функции, таким образом, вы не должны писать DECLARE больше внутри блока

  • анонимный блок начинается с DECLARE и заканчивается КОНЕЦ;

Что касается кода/блока кодов, сохраненных в proc1.sql.

  • Ваше заявление неуместно.Вы должны поместить его после окончания процедуру,
  • Начните процедуру с CREATE OR REPLACE ПРОЦЕДУРЫ

Try Этот блок:

-- DECLARE    
    -- B VARCHAR2(25); 
    -- C NUMBER; 

    CREATE OR REPLACE PROCEDURE Get_manager_detailS(NO IN NUMBER, 
                NAME OUT VARCHAR2, 
                SAL1 OUT NUMBER) 
    IS 
    BEGIN 
     SELECT ENAME, SAL 
     INTO NAME, SAL1 
     FROM EMP 
      WHERE EMPNO = NO; 
    END; -- end of procedure 

    /

    DECLARE -- start of anonymous block    
     B VARCHAR2(25); 
     C NUMBER; 
    BEGIN 
     Get_manager_detailS(7900,B,C); 
     DBMS_OUTPUT.PUT_LINE(B); 
     DBMS_OUTPUT.PUT_LINE(C); 
    END; 

Что касается процедуры, которая будет вызывать процедуру get_manager_details. Его будет точно так же, как анонимный блок, единственная разница будет заключаться в том, что он хранится

Основание из уже вышло

  • Если вы не укажете параметры в своей процедуре, скобки не нужны, поэтому удалите ее.

  • Если вы не имеете выходные параметры, которые будут ловить результат вашей процедуры, вы можете использовать dbms_output.put_line как вы использовали в анонимный блок выше

  • переменной объявления должны выполняться после ключевого слова IS и перед операциями BEGIN, поскольку, как я уже отмечал выше, CREATE OR REPLACE ... IS - это неявное объявление для сохраненных функций и процедуры

TRY ЭТО:

CREATE OR REPLACE PROCEDURE Test_Procedure 
    IS -- always start with CREATE OR REPLACE 
     b varchar2(25); 
     c number; 

    BEGIN 
    -- b varchar2(25); misplaced declarations 
    -- c number; 
     DBMS_OUTPUT.PUT_LINE('CALLING'); 
     Get_manager_details(7900,b,c); 
     DBMS_OUTPUT.PUT_LINE(B); -- displays the results b 
     DBMS_OUTPUT.PUT_LINE(C); -- and c 

    END; 

Извините за длинный пост.

НАДЕЖДА ЭТО ПОМОЩЬ.

CHEERS

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