2016-11-21 4 views
2

パッケージ仕様に何かを定義すると、本体に実装する必要があることが分かります。ボディにメソッドを定義できますが、スペックは定義できませんか?Oracleパッケージの仕様と本体

答えて

9

はい、プロシージャまたはファンクションはパッケージ本体では定義できますが、パッケージ仕様では定義できません。仕様のオブジェクトはパブリックです。本体のオブジェクトはそのパッケージ専用です。

create or replace package test_package is 
    procedure public_procedure; 
end; 
/

create or replace package body test_package is 
    procedure private_procedure is 
    begin 
     null; 
    end; 

    procedure public_procedure is 
    begin 
     private_procedure; 
    end; 
end; 
/

がどのように

--WORKS: 
begin 
    test_package.public_procedure; 
end; 
/

--FAILS WITH THIS ERROR: 
-- ORA-06550: line 2, column 15: 
-- PLS-00302: component 'PRIVATE_PROCEDURE' must be declared 
-- ORA-06550: line 2, column 2: 
begin 
    test_package.private_procedure; 
end; 
/

は、なぜあなたはこれを行うために必要となるパッケージを呼び出すために、パッケージ仕様部と本体を作成しますか?

Javaのような言語では、この質問はおそらくあまりにも明白であるため閉鎖されるでしょう。しかし、これはPL/SQLの理解できる質問です。ほとんどのPL/SQLプログラマがすべてを公開するからです。平均的なPL/SQLプログラムを見ると、「これには正当な理由があるに違いありません。

ありません。

プライベートをデフォルトにする必要があります。 が必要な場合は、他のオブジェクトやプログラマーと共有するには、が必要です。または、セッション中に何かを残す必要がある場合。

できるだけ多くの詳細を隠すためにプライベートな手順と機能を使用してください。これにより、パッケージが簡単になります。また、他のプログラムやプログラマーにパッケージを悪用する方法を少なくします。

+0

ありがとうございます。あなたの答えはそれを超えました! –

関連する問題