次の手順があるとします。
PROCEDURE f (param VARCHAR2)
IS
var VARCHAR2(10);
BEGIN
var := 'hi';
END f;
var
なぜ長さを指定する必要があるのか を理解したいのですが、そうでparam
はありません。オラクルのドキュメントでこれに関する情報を見つけるのに苦労しています。
「Oracle Databaseは、プロシージャがコールされた環境から引数の長さ、精度および位取りを導出します。」
この関連する質問を確認してください。
参照: Oracle® Database SQL リファレンス 10g リリース 2 (10.2) セマンティクス / 引数 / データ型を参照してください。
違いは、サブプログラムの見出しには、サブプログラムが呼び出されたときに実際のパラメーターに置き換えられる仮パラメーターがあることです。
create or replace function f(
p_x in varchar2 /* a formal parameter */
,p_y in varchar2 /* a formal parameter */
) return varchar2 /* a formal parameter */
is
begin
return p_x || p_y;
end;
declare
v_z varchar2(10);
v_x constant varchar2(1) := 'X';
begin
v_z := f(v_x, 'Y'); /* actual parameters */
end;
仮パラメーターは制約されていません (ただし、制約付きのサブタイプを使用できます)。また、変数の宣言時に関係のないパラメーター モードと可能なデフォルト値に関する情報も含まれています。
仮パラメータと実パラメータのデータ型は同じではなく、互換性がある必要があります。
他にも多くの詳細がありますが、それらはPL/SQL Language Reference の PL /SQL Subprogramsの章から読むことができます。特にサブプログラム パラメータを参照してください。
正式なパラメーターを制約なしにする必要がある理由はわかりませんが、サブプログラムのヘッダーから (不要な) 詳細を削除して、もう少し抽象化するので、非常に満足しています。