Подтвердить что ты не робот

Вызовите хранимую процедуру другим в 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;
4b9b3361

Ответ 1

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

В SQL * Plus доступны три варианта: call, exec и анонимный блок PL/SQL.

call представляется ключевым словом SQL и документируется в SQL Reference. 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 <procedure_name> будет передан серверу БД как BEGIN <procedure_name>; 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> 

Ответ 2

Конечно, вы просто вызываете его из 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;

Ответ 3

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

Это

Begin
   proc1(input1, input2);
end;
/

вместо

Begin
   call proc1(input1, input2);
end;
/

Ответ 4

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

CALL test_sp_1();
EXEC test_sp_1

Ответ 5

Вызов одной процедуры из другой процедуры:

Один для обычной процедуры:

CREATE OR REPLACE SP_1() AS 
BEGIN
/*  BODY */
END SP_1;

Процедура вызова SP_1 из SP_2:

CREATE OR REPLACE SP_2() AS
BEGIN
/* CALL PROCEDURE SP_1 */
SP_1();
END SP_2;

Вызвать процедуру с помощью REFCURSOR или курсором вывода:

CREATE OR REPLACE SP_1
(
oCurSp1 OUT SYS_REFCURSOR
) AS
BEGIN
/*BODY */
END SP_1;

Вызвать процедуру SP_1, которая вернет REFCURSOR в качестве выходного параметра

CREATE OR REPLACE SP_2 
(
oCurSp2 OUT SYS_REFCURSOR
) AS `enter code here`
BEGIN
/* CALL PROCEDURE SP_1 WITH REF CURSOR AS OUTPUT PARAMETER */
SP_1(oCurSp2);
END SP_2;