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