Вызов хранимой процедуры с другой в Oracle

Кто-нибудь знает способ, или даже если это возможно, вызвать хранимую процедуру из другой? Если да, то как бы вы это сделали?

Вот мой тестовый код:

SET SERVEROUTPUT ON;

DROP PROCEDURE test_sp_1;
DROP PROCEDURE test_sp;

CREATE PROCEDURE test_sp
AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Test works');
END;
/

CREATE PROCEDURE test_sp_1
AS
BEGIN
    DBMS_OUTPUT.PUT_LINE('Testing');
    test_sp;
END;
/

CALL test_sp_1;
35
задан cr0ss 6 March 2014 в 17:13
поделиться

4 ответа

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

В SQL * Plus есть три варианта: вызов , exec и анонимный блок PL / SQL.

call выглядит как ключевое слово SQL и задокументировано в Справочнике по SQL. http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_4008.htm#BABDEHHG Синтаксическая диаграмма указывает на то, что парентез требуется, даже если аргументы не переданы в рутина звонка.

CALL test_sp_1();

Анонимный блок PL / SQL - это PL / SQL, который не находится внутри именованной процедуры, функции, триггера и т. Д. Его можно использовать для вызова вашей процедуры.

BEGIN
    test_sp_1;
END;
/

Exec - это команда SQL * Plus, которая является ярлыком для указанного выше анонимного блока. EXEC <имя_процедуры> будет передано на сервер БД как BEGIN <имя_процедуры>; END;

Полный пример:

SQL> SET SERVEROUTPUT ON
SQL> CREATE OR REPLACE PROCEDURE test_sp 
  2  AS 
  3  BEGIN 
  4      DBMS_OUTPUT.PUT_LINE('Test works'); 
  5  END;
  6  /

Procedure created.

SQL> CREATE OR REPLACE PROCEDURE test_sp_1 
  2  AS
  3  BEGIN
  4      DBMS_OUTPUT.PUT_LINE('Testing'); 
  5      test_sp; 
  6  END;
  7  /

Procedure created.

SQL> CALL test_sp_1();
Testing
Test works

Call completed.

SQL> exec test_sp_1
Testing
Test works

PL/SQL procedure successfully completed.

SQL> begin
  2      test_sp_1;
  3  end;
  4  /
Testing
Test works

PL/SQL procedure successfully completed.

SQL> 
46
ответ дан 27 November 2019 в 07:02
поделиться

Чтобы вызвать процедуру из командной строки SQLPlus, попробуйте одно из следующих действий:

CALL test_sp_1();
EXEC test_sp_1
2
ответ дан 27 November 2019 в 07:02
поделиться

Конечно, вы просто вызываете его из SP, специального синтаксиса нет.

Пример:

   PROCEDURE some_sp
   AS
   BEGIN
      some_other_sp('parm1', 10, 20.42);
   END;

Если процедура находится в схеме, отличной от той, в которой находится выполняемая процедура, вам необходимо добавить к ней префикс с именем схемы.

   PROCEDURE some_sp
   AS
   BEGIN
      other_schema.some_other_sp('parm1', 10, 20.42);
   END;
14
ответ дан 27 November 2019 в 07:02
поделиться

@Michael Lockwood - вам не нужно нигде использовать ключевое слово "CALL". Вам просто нужно прямо упомянуть вызов процедуры.

То есть

Begin
   proc1(input1, input2);
end;
/

вместо

Begin
   call proc1(input1, input2);
end;
/
2
ответ дан 27 November 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: