web-dev-qa-db-ja.com

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
electricsheep

ストアドプロシージャは、コーディングされたとおりに機能します。問題は最後の行にあり、どちらのストアドプロシージャも呼び出すことができません。

SQL * Plusの3つの選択肢は、callexec、および異常な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> 
46

もちろん、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
dcp

別のプロシージャから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;
2
Nirav savla

SQLPlusコマンドラインからプロシージャを呼び出すには、次のいずれかを試してください。

CALL test_sp_1();
EXEC test_sp_1
2
Dave Costa

@Michael Lockwood-キーワード「CALL」をどこでも使用する必要はありません。プロシージャコールに直接言及する必要があります。

あれは

Begin
   proc1(input1, input2);
end;
/

の代わりに

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