すべてのプロダクト
Search
ドキュメントセンター

PolarDB:サブプログラム

最終更新日:Jun 03, 2024

このトピックでは、サブプログラムの宣言とサブプログラムの使用方法について説明します。

概要

プログラムは、関数および手順を含む。 PL/SQLブロックで作成されるプログラムは、ネストされたサブプログラムと呼ばれます。 PL/SQLブロックまたはパッケージにサブプログラムを作成できます。 PL/SQLブロックは、別のサブプログラムであってもよい。 サブプログラムをグローバルに作成することもできます。 プログラムの宣言と定義を同時に行うことができます。 または、同じブロックで定義する前にプログラムを宣言することもできます。これは、フォワード宣言と呼ばれます。 CREATE FUNCTIONまたはCREATE PROCEDUREを使用して、グローバルプログラムを宣言できます。 パッケージでプログラムを宣言して定義することもできます。 ほとんどの場合、プログラムはパッケージヘッダーで宣言され、パッケージ本体で定義されます。 グローバルプログラムを宣言するか、パッケージでプログラムを宣言して定義するかにかかわらず、プログラムはシステムテーブルに格納されます。 また、他のネストされたサブプログラムはサブプログラムと呼ばれます。 サブプログラムはシステムテーブルに格納されておらず、ネストされたブロックで呼び出された場合にのみコンパイルされて実行されます。

サブプログラムの宣言

次の構文を使用して、サブプログラムを宣言できます。

<bx id="1" type="code" text="code id=" no5euo "title=" "uuuid=" lkb4jru19c1ntxqh2v "code=" DECLARE -- 対象となるコードが表示されます。[FUNCTION] -- 管理部
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ))
{RETURNS | RETURN} rettype
{AS | IS}
[DECLARE] -- 音域数明期
...
BEGIN -- グループ内の関数
...
戻る...
エンド;

BEGIN -- 送信元

END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE-外部匿名ブロック。これもグローバルプロシージャとすることができます。

  [機能] − サブ機能。
      name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ))
  {RETURNS | RETURN} rettype 
  {AS | IS}
  [DECLARE] − サブ関数の宣言セクション。
    ...
  BEGIN -- サブ関数のプログラムセクション。
    ...
    戻る...
  エンド;

BEGIN -- 外部プログラムセクション。

エンド; 
説明

FUNCTIONprocedureに置き換えることで、ローカルプロシージャを宣言することもできます。値を返す必要はありません。

サブプログラムの使用

次のサンプルコードは、サブプログラムの使用方法の例を示しています。

<bx id="1" type="code" text="code id=" hdlidx "title=" "uuid=" lkb59zi89s5zbj5dope "code=" DECLARE
INT;
FUNCTION local_func RETURN INT -- 音声明系部分関数
IS
開始
リターン10;
エンド;
開始
a := local_func(); -- 対象部分として
RAISE NOTICE 'a: % '、a;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  INT;
  FUNCTION local_func RETURN INT − サブファンクションを宣言する。
  IS
  BEGIN
    リターン10;
  エンド;
開始
  a := local_func(); -- サブ関数を呼び出す。
  RAISE NOTICE 'a: % '、a;
エンド; 

関数はオーバーロードされる可能性があります。つまり、同じ関数名の関数は異なるパラメーターリストを持つことができます。 このため、システムは通常、local_funcに基づいてシステムテーブル内の一連の候補関数を検索し、実行する最も一致するパラメータリストを選択します。 場合によっては、関数が一致しない。 このプロセスの間、システムは、優先的に、層ごとに一致するサブ機能を探索する。 次のサンプルコードは、システムが最も一致するサブ関数を検索する方法を示しています。

<bx id="1" type="code" text="code code=" DECLARE
プロシージャlocal_proc1 IS
開始
RAISE NOTICE 'outer local_procedure1を呼び出す';
エンド;

プロシージャlocal_proc2 IS
proc2_str VARCHAR(50);
FUNCTION local_func RETURN VARCHAR IS
func_str VARCHAR(50) := 'inner local_func';
開始
local_proc1(); -- 元local_proc1
戻るfunc_str;
エンド;
開始
proc2_str := local_func();
通知 '%' を上げる, proc2_str;
エンド;
開始
local_proc2();
END;"id=" dc4fxd "title=" "uuid=" lkb5pan19iywmmjetzq "data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
    プロシージャlocal_proc1 IS
    BEGIN
        RAISE NOTICE 'outer local_procedure1を呼び出す';
    END;

    プロシージャlocal_proc2 IS
        proc2_str VARCHAR(50);
        FUNCTION local_func RETURN VARCHAR IS
            func_str VARCHAR(50) := 'inner local_func';
        BEGIN
            local_proc1(); -- outer local_proc1が見つかりました。
            戻るfunc_str;
        END;
    BEGIN
        proc2_str := local_func();
        通知 '%' を上げる, proc2_str;
    エンド;
開始
    local_proc2();
エンド; 

次のようなレスポンスが返されます。

<g id="1" type="code" text="code id=" notffl "title=" "uuid=" lkbx4exo035eo6ddm238 "code=" NOTICE: call outer local_procedure1
注意: raise inner local_func "data-tag=" codeblock "outputclass=" language-plsql "">NOTICE: call outer local_procedure1
注意: inner local_func
を上げる

システムが特定のレイヤにおいて同じ名前を有する少なくとも1つのサブ機能を発見した場合、システムは検索を停止し、実行するサブ機能の中で最も一致するサブ機能を選択する。 ただし、システムが同じ名前のサブ関数を見つけたが、最も一致するサブ関数を選択できなかった場合は、エラーが報告されます。

<bx id="1" type="code" text="code id=" o643da "title=" "uuid=" lkbx5xmaemnswb8yhvs "code=" DECLARE
プロシージャlocal_proc1 IS
開始
RAISE NOTICE 'outer local_procedure1を呼び出す';
エンド;

プロシージャlocal_proc2 IS
proc2_str VARCHAR(50);
FUNCTION local_func RETURN VARCHAR IS
func_str VARCHAR(50) := 'inner local_func';
開始
local_proc1(1); -- 元local_proc1, 気になる
戻るfunc_str;
エンド;
開始
proc2_str := local_func();
通知 '%' を上げる, proc2_str;
エンド;
開始
local_proc2();
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
    プロシージャlocal_proc1 IS
    BEGIN
        RAISE NOTICE 'outer local_procedure1を呼び出す';
    END;

    プロシージャlocal_proc2 IS
        proc2_str VARCHAR(50);
        FUNCTION local_func RETURN VARCHAR IS
            func_str VARCHAR(50) := 'inner local_func';
        BEGIN
            local_proc1(1); − 外側のlocal_proc1が見つかるが、一致させることはできない。
            戻るfunc_str;
        END;
    BEGIN
        proc2_str := local_func();
        通知 '%' を上げる, proc2_str;
    エンド;
開始
    local_proc2();
エンド; 

次のようなレスポンスが返されます。

ERROR: ローカル関数local_proc1への呼び出しで間違った数または引数の種類

フォワード宣言

同じPL/SQLブロック内のネストされたサブプログラムが互いに呼び出す場合、サブプログラムを呼び出す前に宣言する必要があるため、前方宣言が必要です。 宣言後に同じPL/SQLブロックにサブプログラムが定義されていない場合、エラーが報告されます。

<bx id="1" type="code" text="code id=" i6htmv "title=" "uuid=" lkbxjmk19hrhxyopvwv "code=" DECLARE
FUNCTION func_test(id INT) return INT; -- 発音明, 定義
開始
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
    FUNCTION func_test(id INT) はINTを返します。-- サブプログラムを定義せずに宣言するだけです。
開始
エンド; 

次のようなレスポンスが返されます。

ERROR: 前方宣言関数 "func_test" に対してサブルーチン本体を定義する必要があります

次のサンプルコードは、forward宣言の使用方法の例を示しています。

<bx id="1" type="code" text="code id=" b0hmub "title=" "uuid=" lkbxmmp61y6jr611cht "code=" DECLARE
PROCEDURE proc1(number1 NUMBER); -- 前向声明proc1

PROCEDURE proc2(number2 NUMBER) IS -- 声明文定义proc2
開始
proc1(number2); -- proc1
エンド;

-- 定義proc 1:
PROCEDURE proc1(number1 NUMBER) IS-定义proc1
開始
proc2 (number1); -- proc2
エンド;

開始
NULL;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
  PROCEDURE proc1(number1 NUMBER); -proc1を宣言します。

  PROCEDURE proc2(number2 NUMBER) IS -- proc2を宣言し、定義します。
  BEGIN
    proc1(number2); -- proc1を呼び出します。
  END;

  -- 定義proc 1:
  PROCEDURE proc1(number1 NUMBER) IS -- proc1を定義します。
  BEGIN
    proc2 (number1); -- proc2を呼び出します。
  エンド;

開始
  NULL;
エンド; 
説明

ネストされた呼び出しに正しい終了条件があることを確認します。 それ以外の場合、ネストされた呼び出しの数が呼び出し履歴の上限を超えると、エラーが報告されます。

外部プログラム変数の使用

このトピックのサブプログラムの使用セクションでは、外部サブ関数の使用方法の例を示します。 サブプログラムが宣言される前に宣言されたすべての変数、カーソル、およびカスタム例外を直接使用できます。 変数の値を設定したり、変数に値を割り当てたり、有効なカーソルから行をフェッチしたり、外部カスタム例外を使用して例外をスローしたりできます。 次のサンプルコードは、変数可视性のデザインを示しています。

<bx id="1" type="code" text="code id=" xvsgiz "title=" "uuid=" lkbxbs0l5u7zzrxwoh "code=" DECLARE
a INT := 1; -- によって
プロシージャlocal_proc IS
開始
RAISE NOTICE '外部local_procedureを呼び出す';
RAISE NOTICE 'inner raise a: % '、a;
a := 10;
エンド;
b INT; -- 無料使用b
開始
RAISE NOTICE 'outer raise a: % '、a;
local_proc();
RAISE NOTICE 'outer raise a: % '、a;
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
    a INT := 1; -- 変数aは使用可能である。
    プロシージャlocal_proc IS
    BEGIN
        RAISE NOTICE '外部local_procedureを呼び出す';
        RAISE NOTICE 'inner raise a: % '、a;
        a := 10;
    END;
    b INT; -- 変数bは使用できません。
BEGIN
    RAISE NOTICE 'outer raise a: % '、a;
    local_proc();
    RAISE NOTICE 'outer raise a: % '、a;
エンド; 

次のようなレスポンスが返されます。

<g id="1" type="code" text="code id=" 5etpif "title=" "uuid=" lkbxea6ml7dnfzrahp "code=" NOTICE: outer raise a: 1
注意: 外部local_procedureを呼び出す
注意: インナーレイズa: 1
注意: outer raise a: 10 "data-tag=" codeblock "outputclass=" language-plsql ""> 注意: outer raise a: 1
注意: 外部local_procedureを呼び出す
注意: インナーレイズa: 1
注意: アウターレイズa: 10 

local_procの後に宣言された変数を使用すると、構文エラーが発生します。 次のサンプルコードは、例を示しています。

<bx id="1" type="code" text="code id=" aa9igo "title=" "uuid=" lkbxf1x9hmvhk1ac99n "code=" DECLARE
a INT := 1; -- によって
プロシージャlocal_proc IS
開始
RAISE NOTICE '外部local_procedureを呼び出す';
RAISE NOTICE 'inner raise a: % '、a;
a := 10;
エンド;
b INT; -- 無料使用b
開始
local_proc();
END;"data-tag=" codeblock "outputclass=" language-plsql ""/>DECLARE
    a INT := 1; -- 変数aは使用可能である。
    プロシージャlocal_proc IS
    BEGIN
        RAISE NOTICE '外部local_procedureを呼び出す';
        RAISE NOTICE 'inner raise a: % '、a;
        a := 10;
    END;
    b INT; -- 変数bは使用できません。
BEGIN
    local_proc();
エンド; 

次のようなレスポンスが返されます。

エラー: "b" は既知の変数ではありません