Oracle PL/SQLストアド・プロシージャとファンクションと例

⚡ スマートサマリー

PL/SQLのサブルーチンは、データベースに格納され、名前で呼び出されるブロック、プロシージャ、および関数です。プロシージャは処理を実行し、関数は値を返します。どちらもIN、OUT、IN OUTパラメータとRETURNキーワードを介してデータをやり取りします。

  • 🧩 2つのサブプログラム: 手続きは処理を実行し、関数は計算を実行して値を返します。
  • 🔌 パラメーター: INは入力を渡し、OUTは出力を返し、IN OUTは入力と出力の両方を渡す。
  • ↩️ 戻る: 呼び出し元に制御を戻します。関数内では、宣言された型の値も返します。
  • 🗄️ 保存されたオブジェクト: どちらもデータベースオブジェクトとして保存され、他のブロックから呼び出すことができます。
  • 🔎 選択する使用方法: DMLを含まない関数はSELECT文の中で呼び出すことができますが、プロシージャは呼び出すことができません。
  • <XNUMXxEXNUMX><XNUMXxEXNUMX><XNUMXxXNUMXA><XNUMXxXNUMX><XNUMXxXNUMXA>️️ 主な違い: 関数は必ず値を返さなければならないが、手続きは必ずしも値を返す必要はない。
  • 🛠️ 組み込み関数: Oracle 船名変換、文字列変換、日付変換機能がすぐに使用できます。

Oracle PL/SQLストアドプロシージャと関数

PL/SQLサブプログラムとは何ですか?

このチュートリアルでは、名前付きブロック、プロシージャ、および関数を作成および実行する方法について詳しく説明します。

プロシージャと関数は、データベースオブジェクトとしてデータベース内に作成および保存できるサブルーチンです。これらは、他のブロック内から呼び出したり参照したりすることもできます。

また、これら 2 つのサブプログラムの主な違いについても説明し、 Oracle 組み込み関数。

PL/SQLサブプログラムの用語

PL/SQLサブプログラムについて学ぶ前に、これらのサブプログラムに含まれる様々な用語について説明します。

パラメータとは、有効な値の変数またはプレースホルダーのことです。 PL/SQLデータ型 PL/SQLサブプログラムがメインコードと値を交換するための手段です。このパラメータにより、サブプログラムへの入力と出力が可能になります。trac彼らからの価値の喪失。

  • これらのパラメータは、サブプログラムの作成時に定義する必要があります。
  • これらは、サブルーチンとやり取りするために呼び出し文に含まれています。
  • サブルーチン内のパラメータのデータ型と呼び出し文のデータ型は同じである必要があります。
  • データ型のサイズは動的であるため、パラメータ宣言時に指定すべきではありません。

パラメータは、その目的に基づいて以下のように分類されます。

  1. INパラメータ
  2. OUTパラメータ
  3. IN OUTパラメータ

INパラメータ

  • サブルーチンへの入力として使用されます。
  • これはサブルーチン内の読み取り専用変数であり、サブルーチン内でその値を変更することはできません。
  • 呼び出し文では、変数、リテラル値、または「5*8」や「a/b」のような式を指定できます。
  • デフォルトでは、パラメータはIN型です。

OUTパラメータ

  • サブルーチンからの出力を取得するために使用されます。
  • これはサブルーチン内の読み書き可能な変数であり、サブルーチン内でその値を変更できます。
  • 呼び出し文では、サブルーチンから受け取った値を保持する変数を必ず使用する必要があります。

IN OUTパラメータ

  • サブルーチンへの入力と出力の両方に使用されます。
  • これはサブルーチン内の読み書き可能な変数であり、サブルーチン内でその値を変更できます。
  • 呼び出し文では、サブルーチンから受け取った値を保持する変数を必ず使用する必要があります。

パラメータの型は、サブルーチンを作成する際に指定する必要があります。

リターン

RETURN は、コンパイラにサブルーチンから呼び出し元のステートメントへ制御を移すよう指示するキーワードです。サブルーチン内では、RETURN は単にサブルーチンから制御を終了させる必要があることを意味します。コントローラが RETURN を見つけると、その後のコードはスキップされます。

通常、親ブロック(メインブロック)がサブルーチンを呼び出し、制御は親ブロックから呼び出されたサブルーチンに移ります。サブルーチン内の RETURN 文は、制御を親ブロックに戻します。関数の場合、RETURN 文は値も返します。そのデータ型は、関数宣言時に指定されます。

PL/SQLにおけるプロシージャとは何ですか?

A 手順 PL/SQL のサブルーチンは、名前で呼び出すことができる PL/SQL ステートメントのグループで構成されます。各プロシージャには固有の名前があり、 Oracle データベースをデータベースオブジェクトとして扱う。

注意: サブルーチンとは、単なる手順のことで、要件に応じて手動で作成する必要があります。作成後は、データベースオブジェクトとして保存されます。

PL/SQLにおけるプロシージャサブプログラムユニットの特性は以下のとおりです。

  • プロシージャは、 データベース.
  • PL/SQL文を実行するために、それらを名前で呼び出すことができます。
  • これらは主にプロセスを実行するために使用されます。
  • それらはネストされたブロックを持つことができ、また他のブロックやパッケージの中にネストされることもできます。
  • これらは、宣言部(オプション)、実行部、および例外処理部(オプション)から構成されます。
  • 値は、パラメーターを介してプロシージャに渡したり、プロシージャから取得したりできます。
  • これらのパラメータは呼び出しステートメントに含める必要があります。
  • プロシージャには、呼び出し元のブロックに制御を戻すための RETURN ステートメントを含めることができますが、RETURN を介して値を返すことはできません。
  • プロシージャはSELECT文から直接呼び出すことはできません。別のブロックから呼び出すか、EXECキーワードを介して呼び出す必要があります。

構文

CREATE OR REPLACE PROCEDURE
<procedure_name>
(
<parameter1 IN/OUT <datatype>
..
.
)
[ IS | AS ]
<declaration_part>
BEGIN
<execution part>
EXCEPTION
<exception handling part>
END;
  • CREATE PROCEDURE は、コンパイラに新しいプロシージャを作成するように指示します。キーワード 'OR REPLACE' は、既存のプロシージャ(存在する場合)を現在のプロシージャで置き換えるように指示します。
  • 手続き名は一意である必要があります。
  • キーワード「IS」は、ストアドプロシージャが他のブロック内にネストされている場合に使用します。プロシージャがスタンドアロンの場合は「AS」を使用します。このコーディング規則を除けば、両者は同じ意味を持ちます。

例1:プロシージャを作成し、EXECを使用して呼び出す。 この例では、 Oracle 名前を入力として受け取り、ウェルカムメッセージを出力として表示するプロシージャ。このプロシージャはEXECコマンドを使用して呼び出されます。

CREATE OR REPLACE PROCEDURE welcome_msg (p_name IN VARCHAR2)
IS
BEGIN
dbms_output.put_line ('Welcome '|| p_name);
END;
/
EXEC welcome_msg ('Guru99');

Code 説明:

  • Code 1行目: 名前が「welcome_msg」で、型が「IN」のパラメータ「p_name」を1つ持つプロシージャを作成します。
  • Code 4行目: 入力された名前を連結してウェルカムメッセージを表示します。
  • 手順は正常にコンパイルされました。
  • Code 7行目: パラメーター ' を指定して EXEC を使用してプロシージャを呼び出すGuru99'。プロシージャが実行され、「ようこそ」と出力されます。 Guru99。 "

関数とは

関数は、独立したPL/SQLサブプログラムです。プロシージャと同様に、関数には一意の名前があり、PL/SQLデータベースオブジェクトとして格納されます。その特徴は以下のとおりです。

  • 関数は、主に計算に使用される独立したブロックです。
  • 関数は、RETURNキーワードを使用して値を返します。その値のデータ型は、関数の作成時に定義されます。
  • 関数は値を返すか、例外を発生させる必要があります。関数において値を返すことは必須です。
  • DML文を含まない関数はSELECTクエリ内で直接呼び出すことができますが、DMLを含む関数は他のPL/SQLブロックからのみ呼び出すことができます。
  • ネストされたブロックを持つことができ、他のブロックやパッケージの中にネストすることもできます。
  • これには、宣言部(オプション)、実行部、および例外処理部(オプション)が含まれます。
  • 値は、パラメータを介して関数に渡したり、関数から取得したりできます。
  • これらのパラメータは呼び出しステートメントに含める必要があります。
  • 関数は、RETURN を使用するだけでなく、OUT パラメータを介して値を返すこともできます。
  • 常に値を返すため、呼び出し元のステートメントは常に代入演算子を使用して変数に値を代入します。

PL/SQL関数構造

構文

CREATE OR REPLACE FUNCTION
<function_name>
(
<parameter1 IN/OUT <datatype>
)
RETURN <datatype>
[ IS | AS ]
<declaration_part>
BEGIN
<execution part>
EXCEPTION
<exception handling part>
END;
  • CREATE FUNCTION は、コンパイラに新しい関数を作成するように指示します。OR REPLACE は、既存の関数(存在する場合)を現在の関数で置き換えるように指示します。
  • 関数名は一意である必要があります。
  • 戻り値のデータ型を明記する必要があります。
  • キーワード「IS」は、関数が他のブロックの中にネストされている場合に使用します。関数が単独で使用される場合は、「AS」を使用します。

例1:関数を作成し、匿名ブロックを使用して呼び出す。 このプログラムでは、匿名ブロックとSELECT文を使用して、名前を入力として受け取り、ウェルカムメッセージを返す関数を作成します。

PL/SQL関数を作成して呼び出す

CREATE OR REPLACE FUNCTION welcome_msg_func ( p_name IN VARCHAR2) RETURN VARCHAR2
IS
BEGIN
RETURN ('Welcome '|| p_name);
END;
/
DECLARE
lv_msg VARCHAR2(250);
BEGIN
lv_msg := welcome_msg_func ('Guru99');
dbms_output.put_line(lv_msg);
END;
/
SELECT welcome_msg_func('Guru99') FROM DUAL;

Code 説明:

  • Code 1行目: 'welcome_msg_func' という名前で、型が 'IN' のパラメータ 'p_name' を 1 つ持つ関数を作成します。
  • Code 2行目: 戻り値の型をVARCHAR2として宣言します。
  • Code 5行目: 連結された値「Welcome」とパラメータ値を返します。
  • Code 8行目: 上記の関数を呼び出すための匿名ブロック。
  • Code 9行目: 変数を、関数の戻り値の型と同じデータ型で宣言する。
  • Code 11行目: 関数を呼び出し、戻り値を変数「lv_msg」に格納します。
  • Code 12行目: 変数の値を表示します。出力は「ようこそ」です。 Guru99。 "
  • Code 14行目: SELECT文を通して同じ関数を呼び出します。戻り値は標準出力に出力されます。

手順と関数の類似点

  • どちらも他の PL/SQL ブロックから呼び出すことができます。
  • サブルーチンで発生した例外がサブルーチンで処理されない場合 例外処理 セクション内では、呼び出し元のブロックに伝播します。
  • どちらも必要な数のパラメータを持つことができます。
  • どちらも、PL/SQL ではデータベース オブジェクトとして扱われます。

手順と機能:主な違い

手順 演算
主に特定のプロセスを実行するために使用されます。 主に計算処理に使用されます。
SELECT文内では呼び出すことができません。 DML文を含まない関数は、SELECT文内で呼び出すことができます。
OUTパラメータを使用して値を返します。 RETURN 関数を使用して値を返します。
値を返すことは必須ではありません。 値を返すことは必須です。
RETURN は、サブルーチンから制御を抜けるだけです。 RETURN はサブルーチンから制御を終了し、値を返します。
作成時に戻り値のデータ型が指定されていません。 戻り値のデータ型は作成時に必須です。

PL/SQLの組み込み関数

PL / SQLの 文字列型と日付型を扱うための様々な組み込み関数が含まれています。ここでは、よく使われる関数とその使い方を見ていきましょう。

変換関数

これらの組み込み関数は、あるデータ型を別のデータ型に変換します。

関数名 使用法 例:
TO_CHAR 別のデータ型を文字データ型に変換します。 TO_CHAR(123);
TO_DATE(文字列、フォーマット) 指定された文字列を日付に変換します。文字列は指定された形式に一致している必要があります。 TO_DATE('2015-JAN-15', 'YYYY-MON-DD'); 出力:1 / 15 / 2015
TO_NUMBER (テキスト、フォーマット) テキストを、指定された形式の数値に変換します。この形式では、「9」は桁数を表します。 デュアルから TO_NUMBER('1234','9999') を選択します。 出力: 1234. Select TO_NUMBER('1,234.45′,'9,999.99') from dual; 出力1234.45年

文字列関数

これらの関数は文字データ型で使用されます。

関数名 使用法 例:
INSTR(テキスト、文字列、開始位置、発生箇所) 指定された文字列内の特定のテキストの位置を示します。text はメインの文字列、string は検索対象のテキスト、start は開始位置 (省略可能)、occurrence は検索対象の文字列の出現回数 (省略可能) です。 デュアルからINSTR('AEROPLANE','E',2,1)を選択します。 出力: 2. select INSTR('AEROPLANE','E',2,2) from dual; 出力: 9 (Eの2回目の出現)
SUBSTR (テキスト、開始位置、長さ) メイン文字列の部分文字列値を返します。textはメイン文字列、startは開始位置、lengthは部分文字列の長さです。 select substr('aeroplane',1,7) from dual; 出力:エアロプラ
上部(テキスト) 指定されたテキストを大文字に変換して返します。 デュアルからアッパー('guru99')を選択します。 出力: グル99
下(テキスト) 指定されたテキストを小文字に変換して返します。 デュアルからlower('AerOpLane')を選択します。 出力: 飛行機
INITCAP(テキスト) 指定されたテキストの各単語の先頭文字を大文字にして返します。 デュアルからINITCAP('guru99')を選択します。 出力: Guru99. select INITCAP('my story') from dual; 出力: 私の物語
長さ(テキスト) 指定された文字列の長さを返します。 SELECT LENGTH('guru99') FROM dual; 出力6年
LPAD (テキスト、長さ、パディング文字) 左側の文字列を、指定された文字で指定された全長まで埋めます。 デュアルから LPAD('guru99', 10, '$') を選択します。 出力: $$$$グル99
RPAD (テキスト、長さ、pad_char) 指定された文字を使用して、右側の文字列を指定された全長まで埋めます。 RPAD('guru99′,10,'-') を dual から選択します。 出力: guru99—-
LTRIM(テキスト) テキストの先頭の空白を削除します。 LTRIM(' を選択します Guru99フィート)デュアルから; 出力: Guru99
RTRIM(テキスト) テキスト末尾の空白文字を削除します。 RTRIM(' を選択しますGuru99 ') デュアルから; 出力: Guru99

日付関数

これらの関数は日付を操作するために使用されます。

関数名 使用法 例:
ADD_MONTHS (日付、月数) 指定された月数を日付に加算します。 ADD_MONTHS('2015-01-01',5); 出力:05 / 01 / 2015
システムデート サーバーの現在の日時を返します。 デュアルから SYSDATE を選択します。 出力: 10/4/2015 2:11:43
TRUNC 日付変数を可能な限り最小値に切り捨てます。 デュアルから sysdate、TRUNC(sysdate) を選択します。 出力: 10/4/2015 2:12:39 PM, 10/4/2015
ROUND 日付を最も近い上限または下限に丸めます。 SELECT sysdate, ROUND(sysdate) FROM dual; 出力: 10/4/2015 2:14:34 PM, 10/5/2015
MONTHS_BETWEEN 2つの日付間の月数を返します。 SELECT MONTHS_BETWEEN (sysdate+60, sysdate) FROM dual; 出力2年

よくあるご質問

関数は値を返す必要があり、DML 操作を行わない場合は SELECT 文内で使用できます。プロシージャはプロセスを実行するものであり、値を返す必要はなく、SELECT 文から呼び出すことはできません。

IN は読み取り専用の値をサブルーチンに渡します。OUT は呼び出し元に値を返します。IN OUT は、値を受け取り、同じパラメータを通して変更された可能性のある値を返すという両方の機能を持ちます。

はい、INSERT、UPDATE、DELETEなどのDML操作が含まれていない場合は可能です。DMLを実行する関数は、別のPL/SQLブロックからのみ呼び出すことができ、クエリ内から直接呼び出すことはできません。

はい。AIは、平易な記述から、適切なパラメータモードと戻り値の型を持つCREATE PROCEDUREまたはCREATE FUNCTIONを作成できます。 Revデプロイ前に、パラメータと例外処理を確認してください。

OR REPLACE は、同じ名前の既存のプロシージャまたは関数を削除せずに上書きします。ping まず最初にそれを実行します。こうすることで、助成金がそのまま維持され、変更されたサブプログラムを再展開する際の一般的な方法となります。