誰かがストアドプロシージャを別の内部から呼び出す方法を知っていますか、それが可能であっても知っていますか?もしそうなら、どのようにしますか?
これが私のテストコードです。
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;
ストアドプロシージャは、コーディングされたとおりに機能します。問題は最後の行にあり、どちらのストアドプロシージャも呼び出すことができません。
SQL * Plusの3つの選択肢は、call
、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 <procedure_name>
はBEGIN <procedure_name>; END;
としてDBサーバーに渡されます
完全な例:
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>
もちろん、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;
別のプロシージャから1つのプロシージャを呼び出す:
通常の手順用:
CREATE OR REPLACE SP_1() AS
BEGIN
/* BODY */
END SP_1;
SP_2からのプロシージャSP_1の呼び出し:
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;
出力パラメータとしてREFCURSORを返すプロシージャSP_1を呼び出します
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;
SQLPlusコマンドラインからプロシージャを呼び出すには、次のいずれかを試してください。
CALL test_sp_1();
EXEC test_sp_1
@Michael Lockwood-キーワード「CALL」をどこでも使用する必要はありません。プロシージャコールに直接言及する必要があります。
あれは
Begin
proc1(input1, input2);
end;
/
の代わりに
Begin
call proc1(input1, input2);
end;
/