サーチ…


構文

  • CREATE [OR REPLACE]パッケージpackage_name

    [AUTHID {CURRENT_USER | DEFINER}]

    {IS |として}

    [PRAGMA SERIALLY_REUSABLE;]

    [collection_type_definition ...]

    [record_type_definition ...]

    [subtype_definition ...]

    [collection_declaration ...]

    [constant_declaration ...]

    [例外の宣言...]

    [object_declaration ...]

    [record_declaration ...]

    [variable_declaration ...]

    [cursor_spec ...]

    [function_spec ...]

    [procedure_spec ...]

    [call_spec ...]

    [PRAGMA RESTRICT_REFERENCES(アサーション)...]

    END [パッケージ名];

  • パッケージの作成または置換PackageName IS

    ファンクションFunctionName(parameter1 IN VARCHAR2、paramter2 IN NUMBER)RETURN VARCHAR2;

    END PackageName;

  • CREATE [OR REPLACE]パッケージ本体package_name

    {IS |として}

    [PRAGMA SERIALLY_REUSABLE;]

    [collection_type_definition ...]

    [record_type_definition ...]

    [subtype_definition ...]

    [collection_declaration ...]

    [constant_declaration ...]

    [例外の宣言...]

    [object_declaration ...]

    [record_declaration ...]

    [variable_declaration ...]

    [cursor_body ...]

    [function_spec ...]

    [procedure_spec ...]

    [call_spec ...]

    END [パッケージ名];

  • Package BODY PackageName ISを作成または置換します。

    ファンクションFunctionName(parameter1 IN VARCHAR2、paramter2 IN NUMBER)RETURN VARCHAR2 IS

    宣言

    ベギン

    実行するステートメント

    RETURN varchar2変数

    END FunctionName;

    END PackageName;

パッケージの使用

PLSQLのパッケージは、プロシージャ、関数、変数、例外、定数、およびデータ構造の集合です。一般に、パッケージ内のリソースは互いに関連しており、同様のタスクを実行します。

パッケージを使う理由

  • モジュール性
  • パフォーマンス/意欲の向上

パッケージの一部

仕様 - パッケージヘッダーと呼ばれることもあります。変数と型の宣言と、パッケージ内にある関数とプロシージャのシグネチャを含みます。これらはパッケージの外部から呼び出されるpublicです。

パッケージ本体 - コードとプライベート宣言が含まれます。

パッケージ仕様は、パッケージ本体の前にコンパイルする必要があります。そうしないと、パッケージ本体のコンパイルによってエラーが報告されます。

オーバーロード

パッケージ内の関数とプロシージャは、オーバーロードすることができます。次のパッケージTESTには、 print_numberという2つのプロシージャがあります。これらのプロシージャは、呼び出されるパラメータによって異なる動作をします。

create or replace package TEST is
  procedure print_number(p_number in integer);
  procedure print_number(p_number in varchar2);
end TEST;
/
create or replace package body TEST is

  procedure print_number(p_number in integer) is
  begin
    dbms_output.put_line('Digit: ' || p_number);    
  end;
  
  procedure print_number(p_number in varchar2) is
  begin
    dbms_output.put_line('String: ' || p_number);    
  end;

end TEST;
/

我々は両方の手順を呼ぶ。 1番目は整数パラメータ、2番目はvarchar2です。

set serveroutput on;
-- call the first procedure
exec test.print_number(3);
-- call the second procedure
exec test.print_number('three');

上記のスクリプトの出力は次のとおりです。

SQL> 
Digit: 3
PL/SQL procedure successfully completed
String: three
PL/SQL procedure successfully completed

オーバーロードの制限

ローカルまたはパッケージされたサブプログラムまたは型メソッドのみがオーバーロードされます。したがって、スタンドアロンのサブプログラムを多重定義することはできません。また、仮パラメータが名前またはパラメータ・モードでのみ異なる場合は、2つの副プログラムをオーバーロードできません

関数でパッケージヘッダとボディを定義します。

この例では、パッケージヘッダーとパッケージ本体を関数として定義します。
その後、戻り値を返す関数をパッケージから呼び出しています。

パッケージヘッダー

CREATE OR REPLACE PACKAGE SkyPkg AS

       FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
       RETURN VARCHAR2;
       
END;
/

パッケージ本体

CREATE OR REPLACE PACKAGE BODY SkyPkg AS

        FUNCTION GetSkyColour(vPlanet IN VARCHAR2)
        RETURN VARCHAR2
        AS
               vColour VARCHAR2(100) := NULL;
        BEGIN
               IF vPlanet = 'Earth' THEN
                       vColour := 'Blue';
               ELSIF vPlanet = 'Mars' THEN
                       vColour := 'Red';
               END IF;

               RETURN vColour;
        END;
        
END;
/

パッケージ本体から関数を呼び出す

DECLARE
        vColour VARCHAR2(100);
BEGIN
        vColour := SkyPkg.GetSkyColour(vPlanet => 'Earth');
        DBMS_OUTPUT.PUT_LINE(vColour);
END;
/


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow