PL / SQL-クイックガイド

PL / SQLプログラミング言語は、SQLおよびOracleリレーショナルデータベースの手続き型拡張言語として、1980年代後半にOracleCorporationによって開発されました。以下は、PL / SQLに関する特定の注目すべき事実です。

  • PL / SQLは、完全に移植可能な高性能のトランザクション処理言語です。

  • PL / SQLは、組み込みのインタープリタ型OSに依存しないプログラミング環境を提供します。

  • PL / SQLはコマンドラインから直接呼び出すこともできます SQL*Plus interface

  • データベースへの外部プログラミング言語呼び出しから直接呼び出しを行うこともできます。

  • PL / SQLの一般的な構文は、ADAおよびPascalプログラミング言語の構文に基づいています。

  • Oracleとは別に、PL / SQLは TimesTen in-memory database そして IBM DB2

PL / SQLの機能

PL / SQLには次の機能があります-

  • PL / SQLはSQLと緊密に統合されています。
  • 広範なエラーチェックを提供します。
  • 多数のデータ型を提供します。
  • さまざまなプログラミング構造を提供します。
  • 関数とプロシージャを通じて構造化プログラミングをサポートします。
  • オブジェクト指向プログラミングをサポートします。
  • Webアプリケーションとサーバーページの開発をサポートします。

PL / SQLの利点

PL / SQLには次の利点があります-

  • SQLは標準のデータベース言語であり、PL / SQLはSQLと強力に統合されています。PL / SQLは、静的SQLと動的SQLの両方をサポートします。静的SQLは、PL / SQLブロックからのDML操作とトランザクション制御をサポートします。動的SQLでは、SQLを使用してDDL文をPL / SQLブロックに埋め込むことができます。

  • PL / SQLを使用すると、ステートメントのブロック全体を一度にデータベースに送信できます。これにより、ネットワークトラフィックが減少し、アプリケーションに高いパフォーマンスが提供されます。

  • PL / SQLは、データベース内のデータを照会、変換、および更新できるため、プログラマーに高い生産性を提供します。

  • PL / SQLは、例外処理、カプセル化、データ隠蔽、オブジェクト指向データ型などの強力な機能により、設計とデバッグの時間を節約します。

  • PL / SQLで記述されたアプリケーションは完全に移植可能です。

  • PL / SQLは高いセキュリティレベルを提供します。

  • PL / SQLは、事前定義されたSQLパッケージへのアクセスを提供します。

  • PL / SQLは、オブジェクト指向プログラミングのサポートを提供します。

  • PL / SQLは、Webアプリケーションとサーバーページの開発をサポートします。

この章では、PL / SQLの環境設定について説明します。PL / SQLはスタンドアロンのプログラミング言語ではありません。これは、Oracleプログラミング環境内のツールです。SQL* Plusは、コマンドプロンプトでSQLおよびPL / SQL文を入力できる対話型ツールです。これらのコマンドは、処理のためにデータベースに送信されます。ステートメントが処理されると、結果が返送され、画面に表示されます。

PL / SQLプログラムを実行するには、OracleRDBMSサーバーがマシンにインストールされている必要があります。これにより、SQLコマンドの実行が処理されます。OracleRDBMSの最新バージョンは11gです。Oracle 11gの試用版は、次のリンクからダウンロードできます。

Oracle 11g ExpressEditionをダウンロードする

オペレーティングシステムに応じて、32ビットバージョンまたは64ビットバージョンのインストールをダウンロードする必要があります。通常、2つのファイルがあります。64ビット版をダウンロードしました。LinuxでもSolarisでも、オペレーティングシステムで同様の手順を使用します。

  • win64_11gR2_database_1of2.zip

  • win64_11gR2_database_2of2.zip

上記の2つのファイルをダウンロードした後、それらを1つのディレクトリに解凍する必要があります database その下に次のサブディレクトリがあります-

ステップ1

次に、セットアップファイルを使用してOracleDatabaseInstallerを起動します。以下は最初の画面です。次のスクリーンショットに示すように、メールIDを入力して、チェックボックスをオンにすることができます。クリックNext ボタン。

ステップ2

次の画面が表示されます。チェックボックスをオフにして、Continue ボタンをクリックして続行します。

ステップ3

最初のオプションを選択するだけです Create and Configure Database ラジオボタンを使用して、 Next ボタンをクリックして続行します。

ステップ4

学習の基本的な目的でOracleをインストールし、PCまたはラップトップにインストールすることを前提としています。したがって、Desktop Class オプションをクリックし、 Next ボタンをクリックして続行します。

ステップ5

OracleServerをインストールする場所を指定します。変更するだけですOracle Base他の場所は自動的に設定されます。また、パスワードを入力する必要があります。これは、システムDBAによって使用されます。必要な情報を入力したら、をクリックしますNext ボタンをクリックして続行します。

ステップ6

もう一度、 Next ボタンをクリックして続行します。

ステップ7

クリック Finish続行するボタン。これにより、実際のサーバーのインストールが開始されます。

ステップ8

Oracleが必要な構成の実行を開始するまで、これには少し時間がかかります。

ステップ9

ここで、Oracleのインストールにより、必要な構成ファイルがコピーされます。これには少し時間がかかります-

ステップ10

データベースファイルがコピーされると、次のダイアログボックスが表示されます。クリックするだけですOK ボタンを押して出てきます。

ステップ11

インストールすると、次の最終ウィンドウが表示されます。

最終段階

次に、インストールを確認します。Windowsを使用している場合は、コマンドプロンプトで次のコマンドを使用します-

sqlplus "/ as sysdba"

PL / SQLコマンドとスクリプトを記述するSQLプロンプトが表示されます-

テキストエディタ

コマンドプロンプトから大きなプログラムを実行すると、不注意で作業の一部が失われる可能性があります。コマンドファイルを使用することを常にお勧めします。コマンドファイルを使用するには-

  • 次のようなテキストエディタでコードを入力します Notepad, Notepad+, または EditPlus、など。

  • でファイルを保存します .sql ホームディレクトリの拡張子。

  • を起動します SQL*Plus command prompt PL / SQLファイルを作成したディレクトリから。

  • タイプ @file_name SQL * Plusコマンドプロンプトで、プログラムを実行します。

ファイルを使用してPL / SQLスクリプトを実行していない場合は、PL / SQLコードをコピーして、SQLプロンプトを表示する黒いウィンドウを右クリックします。使用pasteコマンドプロンプトで完全なコードを貼り付けるオプション。最後に、Enter コードがまだ実行されていない場合は、コードを実行します。

この章では、PL / SQLの基本構文について説明します。 block-structured言語; これは、PL / SQLプログラムが分割され、論理的なコードブロックで記述されることを意味します。各ブロックは3つのサブパートで構成されています-

S.No セクションと説明
1

Declarations

このセクションはキーワードで始まります DECLARE。これはオプションのセクションであり、プログラムで使用されるすべての変数、カーソル、サブプログラム、およびその他の要素を定義します。

2

Executable Commands

このセクションはキーワードで囲まれています BEGIN そして ENDそしてそれは必須のセクションです。これは、プログラムの実行可能なPL / SQL文で構成されています。少なくとも1行の実行可能コードが必要です。NULL command 何も実行しないことを示します。

3

Exception Handling

このセクションはキーワードで始まります EXCEPTION。このオプションのセクションには、exception(s) プログラムのエラーを処理します。

すべてのPL / SQL文はセミコロン(;)で終わります。PL / SQLブロックは、を使用して他のPL / SQLブロック内にネストできます。BEGIN そして END。PL / SQLブロックの基本構造は次のとおりです。

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)>
EXCEPTION 
   <exception handling> 
END;

「HelloWorld」の例

DECLARE 
   message  varchar2(20):= 'Hello, World!'; 
BEGIN 
   dbms_output.put_line(message); 
END; 
/

ザ・ end;lineは、PL / SQLブロックの終了を示します。SQLコマンドラインからコードを実行するには、コードの最後の行の後の最初の空白行の先頭に/を入力する必要がある場合があります。上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Hello World  

PL/SQL procedure successfully completed.

PL / SQL識別子

PL / SQL識別子は、定数、変数、例外、プロシージャ、カーソル、および予約語です。識別子は、オプションで文字とそれに続く文字、数字、ドル記号、アンダースコア、および番号記号で構成され、30文字を超えてはなりません。

デフォルトでは、 identifiers are not case-sensitive。だからあなたは使うことができますinteger または INTEGER数値を表します。予約済みのキーワードを識別子として使用することはできません。

PL / SQL区切り文字

区切り文字は、特別な意味を持つ記号です。以下は、PL / SQLの区切り文字のリストです。

デリミタ 説明
+, -, *, / 足し算、引き算/否定、掛け算、割り算
% 属性インジケーター
' 文字列区切り文字
. コンポーネントセレクター
(,) 式またはリスト区切り文字
: ホスト変数インジケーター
, アイテムセパレータ
" 引用符で囲まれた識別子の区切り文字
= 関係演算子
@ リモートアクセスインジケーター
; ステートメントターミネータ
:= 代入演算子
=> アソシエーション演算子
|| 連結演算子
** べき乗演算子
<<, >> ラベル区切り文字(開始と終了)
/*, */ 複数行コメント区切り文字(開始と終了)
-- 単一行コメントインジケータ
.. 範囲演算子
<, >, <=, >= 関係演算子
<>, '=, ~=, ^= NOTEQUALの異なるバージョン

PL / SQLコメント

プログラムコメントは、作成するPL / SQLコードに含めることができる説明文であり、ソースコードを読む人を支援します。すべてのプログラミング言語では、何らかの形式のコメントが許可されています。

PL / SQLは、単一行および複数行のコメントをサポートします。コメント内で使用可能なすべての文字は、PL / SQLコンパイラによって無視されます。PL / SQLの単一行コメントは区切り文字-(二重ハイフン)で始まり、複数行コメントは/ *および* /で囲まれます。

DECLARE 
   -- variable declaration 
   message  varchar2(20):= 'Hello, World!'; 
BEGIN 
   /* 
   *  PL/SQL executable statement(s) 
   */ 
   dbms_output.put_line(message); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Hello World

PL/SQL procedure successfully completed.

PL / SQLプログラムユニット

PL / SQLユニットは、次のいずれかです。

  • PL / SQLブロック
  • Function
  • Package
  • パッケージ本体
  • Procedure
  • Trigger
  • Type
  • タイプボディ

これらの各ユニットについては、次の章で説明します。

この章では、PL / SQLのデータ型について説明します。PL / SQL変数、定数、およびパラメータには、ストレージ形式、制約、および有効な値の範囲を指定する有効なデータ型が必要です。私たちは焦点を当てますSCALAR そしてその LOBこの章のデータ型。他の2つのデータ型については、他の章で説明します。

S.No カテゴリと説明
1

Scalar

次のような内部コンポーネントのない単一の値 NUMBER, DATE, または BOOLEAN

2

Large Object (LOB)

テキスト、グラフィックイメージ、ビデオクリップ、音声波形など、他のデータ項目とは別に保存される大きなオブジェクトへのポインタ。

3

Composite

個別にアクセスできる内部コンポーネントを持つデータ項目。たとえば、コレクションやレコード。

4

Reference

他のデータ項目へのポインタ。

PL / SQLスカラーのデータ型とサブタイプ

PL / SQLスカラーのデータ型とサブタイプは次のカテゴリに分類されます-

S.No 日付の種類と説明
1

Numeric

算術演算が実行される数値。

2

Character

単一文字または文字列を表す英数字の値。

3

Boolean

論理演算が実行される論理値。

4

Datetime

日付と時刻。

PL / SQLは、データ型のサブタイプを提供します。たとえば、データ型NUMBERには、INTEGERというサブタイプがあります。PL / SQLプログラムのサブタイプを使用して、Javaプログラムなどの別のプログラムにPL / SQLコードを埋め込みながら、データ型を他のプログラムのデータ型と互換性のあるものにすることができます。

PL / SQLの数値データ型とサブタイプ

次の表に、PL / SQLの事前定義された数値データ型とそのサブタイプを示します。

S.No データ型と説明
1

PLS_INTEGER

32ビットで表される-2,147,483,648から2,147,483,647の範囲の符号付き整数

2

BINARY_INTEGER

32ビットで表される-2,147,483,648から2,147,483,647の範囲の符号付き整数

3

BINARY_FLOAT

単精度IEEE754形式の浮動小数点数

4

BINARY_DOUBLE

倍精度IEEE754形式の浮動小数点数

5

NUMBER(prec, scale)

絶対値が1E-130から1.0E126(ただし含まない)の範囲の固定小数点数または浮動小数点数。NUMBER変数は0を表すこともできます

6

DEC(prec, scale)

最大精度が10進数の38桁のANSI固有の固定小数点タイプ

7

DECIMAL(prec, scale)

最大精度が10進数の38桁のIBM固有の固定小数点タイプ

8

NUMERIC(pre, secale)

小数点以下38桁の最大精度のフローティングタイプ

9

DOUBLE PRECISION

最大精度が126の2進数(約38の10進数)のANSI固有の浮動小数点型

10

FLOAT

最大精度が126の2進数(約38の10進数)のANSIおよびIBM固有の浮動小数点型

11

INT

最大精度が10進数の38桁のANSI固有の整数型

12

INTEGER

最大精度が10進数の38桁のANSIおよびIBM固有の整数型

13

SMALLINT

最大精度が10進数の38桁のANSIおよびIBM固有の整数型

14

REAL

最大精度63桁(10進数約18桁)の浮動小数点型

以下は有効な宣言です-

DECLARE 
   num1 INTEGER; 
   num2 REAL; 
   num3 DOUBLE PRECISION; 
BEGIN 
   null; 
END; 
/

上記のコードをコンパイルして実行すると、次の結果が得られます。

PL/SQL procedure successfully completed

PL / SQL文字のデータ型とサブタイプ

以下は、PL / SQLの事前定義された文字データ型とそのサブタイプの詳細です。

S.No データ型と説明
1

CHAR

最大サイズが32,767バイトの固定長文字ストリング

2

VARCHAR2

最大サイズが32,767バイトの可変長文字ストリング

3

RAW

PL / SQLによって解釈されない最大サイズ32,767バイトの可変長バイナリまたはバイト文字列

4

NCHAR

最大サイズが32,767バイトの固定長国別文字列

5

NVARCHAR2

最大サイズが32,767バイトの可変長国別文字列

6

LONG

最大サイズが32,760バイトの可変長文字ストリング

7

LONG RAW

PL / SQLによって解釈されない最大サイズ32,760バイトの可変長バイナリまたはバイト文字列

8

ROWID

物理行識別子、通常のテーブルの行のアドレス

9

UROWID

ユニバーサル行識別子(物理、論理、または外部行識別子)

PL / SQLブールデータ型

ザ・ BOOLEANデータ型は、論理演算で使用される論理値を格納します。論理値はブール値ですTRUE そして FALSE と値 NULL

ただし、SQLにはBOOLEANに相当するデータ型はありません。したがって、ブール値は−では使用できません。

  • SQLステートメント
  • 組み込みSQL関数(など TO_CHAR
  • SQL文から呼び出されるPL / SQL関数

PL / SQLの日時タイプと間隔タイプ

ザ・ DATEデータ型は、午前0時からの秒単位の時刻を含む固定長の日時を格納するために使用されます。有効な日付の範囲は、紀元前4712年1月1日から西暦9999年12月31日までです。

デフォルトの日付形式は、Oracle初期化パラメータNLS_DATE_FORMATによって設定されます。たとえば、デフォルトは「DD-MON-YY」の場合があります。これには、月の日の2桁の数字、月名の省略形、および年の下2桁が含まれます。たとえば、01-OCT-12。

各DATEには、世紀、年、月、日、時、分、秒が含まれます。次の表は、各フィールドの有効な値を示しています-

フィールド名 有効な日時値 有効な間隔値
-4712から9999(0年を除く) ゼロ以外の整数
01から12 0から11
01から31(ロケールのカレンダーの規則に従って、MONTHとYEARの値によって制限されます) ゼロ以外の整数
時間 00から23 0から23
00から59 0から59
2番目 00〜59.9(n)、ここで9(n)は時間の小数秒の精度です 0〜59.9(n)、ここで9(n)は間隔の小数秒の精度です
TIMEZONE_HOUR -12〜14(範囲は夏時間の変更に対応) 適用できません
TIMEZONE_MINUTE 00から59 適用できません
TIMEZONE_REGION 動的パフォーマンスビューにありますV $ TIMEZONE_NAMES 適用できません
TIMEZONE_ABBR 動的パフォーマンスビューにありますV $ TIMEZONE_NAMES 適用できません

PL / SQLラージ・オブジェクト(LOB)データ型

ラージオブジェクト(LOB)データ型は、テキスト、グラフィックイメージ、ビデオクリップ、サウンド波形などのラージデータアイテムを指します。LOBデータ型を使用すると、このデータに効率的、ランダム、区分的にアクセスできます。以下は、事前定義されたPL / SQLLOBデータ型です。

データ・タイプ 説明 サイズ
BFILE データベース外のオペレーティングシステムファイルに大きなバイナリオブジェクトを格納するために使用されます。 システムに依存します。4ギガバイト(GB)を超えることはできません。
BLOB 大きなバイナリオブジェクトをデータベースに格納するために使用されます。 8〜128テラバイト(TB)
CLOB データベースに文字データの大きなブロックを格納するために使用されます。 8〜128 TB
NCLOB NCHARデータの大きなブロックをデータベースに格納するために使用されます。 8〜128 TB

PL / SQLユーザー定義サブタイプ

サブタイプは、基本タイプと呼ばれる別のデータ型のサブセットです。サブタイプの有効な操作は基本タイプと同じですが、有効な値のサブセットのみです。

PL / SQLは、パッケージ内のいくつかのサブタイプを事前定義します STANDARD。たとえば、PL / SQLはサブタイプを事前定義しますCHARACTER そして INTEGER 次のように-

SUBTYPE CHARACTER IS CHAR; 
SUBTYPE INTEGER IS NUMBER(38,0);

独自のサブタイプを定義して使用できます。次のプログラムは、ユーザー定義のサブタイプの定義と使用を示しています。

DECLARE 
   SUBTYPE name IS char(20); 
   SUBTYPE message IS varchar2(100); 
   salutation name; 
   greetings message; 
BEGIN 
   salutation := 'Reader '; 
   greetings := 'Welcome to the World of PL/SQL'; 
   dbms_output.put_line('Hello ' || salutation || greetings); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Hello Reader Welcome to the World of PL/SQL 
 
PL/SQL procedure successfully completed.

PL / SQLのNULL

PL / SQLNULL値は missing または unknown dataまた、整数、文字、またはその他の特定のデータ型ではありません。ご了承くださいNULL 空のデータ文字列またはヌル文字値と同じではありません '\0'。nullを割り当てることはできますが、それ自体を含むものと同一視することはできません。

この章では、Pl / SQLの変数について説明します。変数は、プログラムが操作できるストレージ領域に付けられた名前に他なりません。PL / SQLの各変数には、変数のメモリのサイズとレイアウトを決定する特定のデータ型があります。そのメモリ内に格納できる値の範囲と、変数に適用できる一連の操作。

PL / SQL変数の名前は、オプションでさらに文字、数字、ドル記号、アンダースコア、および番号記号が続く文字で構成され、30文字を超えてはなりません。デフォルトでは、変数名では大文字と小文字は区別されません。予約済みのPL / SQLキーワードを変数名として使用することはできません。

PL / SQLプログラミング言語を使用すると、日時データ型、レコード、コレクションなど、さまざまなタイプの変数を定義できます。これについては、以降の章で説明します。この章では、基本的な変数タイプのみを調べてみましょう。

PL / SQLでの変数宣言

PL / SQL変数は、宣言セクションまたはパッケージでグローバル変数として宣言する必要があります。変数を宣言すると、PL / SQLは変数の値にメモリを割り当て、格納場所は変数名で識別されます。

変数を宣言するための構文は次のとおりです。

variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]

ここで、variable_nameはPL / SQLの有効な識別子ですが、datatypeは、有効なPL / SQLデータ型、または前の章ですでに説明したユーザー定義のデータ型である必要があります。いくつかの有効な変数宣言とその定義を以下に示します-

sales number(10, 2); 
pi CONSTANT double precision := 3.1415; 
name varchar2(25); 
address varchar2(100);

データ型にサイズ、スケール、または精度の制限を指定すると、それは constrained declaration。制約付き宣言は、制約なし宣言よりも必要なメモリが少なくて済みます。例-

sales number(10, 2); 
name varchar2(25); 
address varchar2(100);

PL / SQLでの変数の初期化

変数を宣言するたびに、PL / SQLはその変数にデフォルト値のNULLを割り当てます。NULL値以外の値で変数を初期化する場合は、宣言中に次のいずれかを使用して初期化できます。

  • ザ・ DEFAULT キーワード

  • ザ・ assignment オペレーター

例-

counter binary_integer := 0; 
greetings varchar2(20) DEFAULT 'Have a Good Day';

変数にを持たないように指定することもできます NULL を使用した値 NOT NULL制約。NOT NULL制約を使用する場合は、その変数に初期値を明示的に割り当てる必要があります。

変数を適切に初期化することは良いプログラミング手法です。そうしないと、プログラムが予期しない結果を生成することがあります。さまざまなタイプの変数を使用する次の例を試してください-

DECLARE 
   a integer := 10; 
   b integer := 20; 
   c integer; 
   f real; 
BEGIN 
   c := a + b; 
   dbms_output.put_line('Value of c: ' || c); 
   f := 70.0/3.0; 
   dbms_output.put_line('Value of f: ' || f); 
END; 
/

上記のコードを実行すると、次の結果が得られます。

Value of c: 30 
Value of f: 23.333333333333333333  

PL/SQL procedure successfully completed.

PL / SQLの可変スコープ

PL / SQLでは、ブロックをネストできます。つまり、各プログラムブロックに別の内部ブロックを含めることができます。変数が内部ブロック内で宣言されている場合、外部ブロックからはアクセスできません。ただし、変数が宣言されて外部ブロックにアクセスできる場合は、ネストされたすべての内部ブロックにもアクセスできます。可変スコープには2つのタイプがあります-

  • Local variables −内側のブロックで宣言され、外側のブロックからアクセスできない変数。

  • Global variables −最も外側のブロックまたはパッケージで宣言された変数。

次の例は、の使用法を示しています Local そして Global 単純な形式の変数-

DECLARE 
   -- Global variables  
   num1 number := 95;  
   num2 number := 85;  
BEGIN  
   dbms_output.put_line('Outer Variable num1: ' || num1); 
   dbms_output.put_line('Outer Variable num2: ' || num2); 
   DECLARE  
      -- Local variables 
      num1 number := 195;  
      num2 number := 185;  
   BEGIN  
      dbms_output.put_line('Inner Variable num1: ' || num1); 
      dbms_output.put_line('Inner Variable num2: ' || num2); 
   END;  
END; 
/

上記のコードを実行すると、次の結果が得られます。

Outer Variable num1: 95 
Outer Variable num2: 85 
Inner Variable num1: 195 
Inner Variable num2: 185  

PL/SQL procedure successfully completed.

PL / SQL変数へのSQLクエリ結果の割り当て

あなたは使用することができます SELECT INTOPL / SQL変数に値を割り当てるSQL文。の各アイテムについてSELECT list、に対応する型互換変数が必要です INTO list。次の例は、概念を示しています。CUSTOMERSという名前のテーブルを作成しましょう-

((For SQL statements, please refer to the SQL tutorial

CREATE TABLE CUSTOMERS( 
   ID   INT NOT NULL, 
   NAME VARCHAR (20) NOT NULL, 
   AGE INT NOT NULL, 
   ADDRESS CHAR (25), 
   SALARY   DECIMAL (18, 2),        
   PRIMARY KEY (ID) 
);  

Table Created

ここで、テーブルにいくつかの値を挿入しましょう-

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );  

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );  

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
  
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 ); 
 
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );  

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (6, 'Komal', 22, 'MP', 4500.00 );

次のプログラムは、を使用して上記の表の値をPL / SQL変数に割り当てます。 SELECT INTO clause SQLの-

DECLARE 
   c_id customers.id%type := 1; 
   c_name  customers.name%type; 
   c_addr customers.address%type; 
   c_sal  customers.salary%type; 
BEGIN 
   SELECT name, address, salary INTO c_name, c_addr, c_sal 
   FROM customers 
   WHERE id = c_id;  
   dbms_output.put_line 
   ('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal); 
END; 
/

上記のコードを実行すると、次の結果が得られます。

Customer Ramesh from Ahmedabad earns 2000  

PL/SQL procedure completed successfully

この章では、 constants そして literalsPL / SQLで。定数は、一度宣言されるとプログラム内で変更されない値を保持します。定数宣言は、その名前、データ型、および値を指定し、それにストレージを割り当てます。宣言はまた課すことができますNOT NULL constraint

定数の宣言

定数は、を使用して宣言されます CONSTANTキーワード。初期値が必要であり、その値を変更することはできません。例-

PI CONSTANT NUMBER := 3.141592654; 
DECLARE 
   -- constant declaration 
   pi constant number := 3.141592654; 
   -- other declarations 
   radius number(5,2);  
   dia number(5,2);  
   circumference number(7, 2); 
   area number (10, 2); 
BEGIN  
   -- processing 
   radius := 9.5;  
   dia := radius * 2;  
   circumference := 2.0 * pi * radius; 
   area := pi * radius * radius; 
   -- output 
   dbms_output.put_line('Radius: ' || radius); 
   dbms_output.put_line('Diameter: ' || dia); 
   dbms_output.put_line('Circumference: ' || circumference); 
   dbms_output.put_line('Area: ' || area); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Radius: 9.5 
Diameter: 19 
Circumference: 59.69 
Area: 283.53  

Pl/SQL procedure successfully completed.

The PL/SQL Literals

A literal is an explicit numeric, character, string, or Boolean value not represented by an identifier. For example, TRUE, 786, NULL, 'tutorialspoint' are all literals of type Boolean, number, or string. PL/SQL, literals are case-sensitive. PL/SQL supports the following kinds of literals −

  • Numeric Literals
  • Character Literals
  • String Literals
  • BOOLEAN Literals
  • Date and Time Literals

The following table provides examples from all these categories of literal values.

S.No Literal Type & Example
1

Numeric Literals

050 78 -14 0 +32767

6.6667 0.0 -12.0 3.14159 +7800.00

6E5 1.0E-8 3.14159e0 -1E38 -9.5e-3

2

Character Literals

'A' '%' '9' ' ' 'z' '('

3

String Literals

'Hello, world!'

'Tutorials Point'

'19-NOV-12'

4

BOOLEAN Literals

TRUE, FALSE, and NULL.

5

Date and Time Literals

DATE '1978-12-25';

TIMESTAMP '2012-10-29 12:01:01';

To embed single quotes within a string literal, place two single quotes next to each other as shown in the following program −

DECLARE 
   message  varchar2(30):= 'That''s tutorialspoint.com!'; 
BEGIN 
   dbms_output.put_line(message); 
END; 
/

When the above code is executed at the SQL prompt, it produces the following result −

That's tutorialspoint.com!  

PL/SQL procedure successfully completed.

In this chapter, we will discuss operators in PL/SQL. An operator is a symbol that tells the compiler to perform specific mathematical or logical manipulation. PL/SQL language is rich in built-in operators and provides the following types of operators −

  • Arithmetic operators
  • Relational operators
  • Comparison operators
  • Logical operators
  • String operators

Here, we will understand the arithmetic, relational, comparison and logical operators one by one. The String operators will be discussed in a later chapter − PL/SQL - Strings.

Arithmetic Operators

Following table shows all the arithmetic operators supported by PL/SQL. Let us assume variable A holds 10 and variable B holds 5, then −

Show Examples

Operator Description Example
+ Adds two operands A + B will give 15
- Subtracts second operand from the first A - B will give 5
* Multiplies both operands A * B will give 50
/ Divides numerator by de-numerator A / B will give 2
** Exponentiation operator, raises one operand to the power of other A ** B will give 100000

Relational Operators

Relational operators compare two expressions or values and return a Boolean result. Following table shows all the relational operators supported by PL/SQL. Let us assume variable A holds 10 and variable B holds 20, then −

Show Examples

Operator Description Example
= Checks if the values of two operands are equal or not, if yes then condition becomes true. (A = B) is not true.

!=

<>

~=

Checks if the values of two operands are equal or not, if values are not equal then condition becomes true. (A != B) is true.
> Checks if the value of left operand is greater than the value of right operand, if yes then condition becomes true. (A > B) is not true.
< Checks if the value of left operand is less than the value of right operand, if yes then condition becomes true. (A < B) is true.
>= Checks if the value of left operand is greater than or equal to the value of right operand, if yes then condition becomes true. (A >= B) is not true.
<= Checks if the value of left operand is less than or equal to the value of right operand, if yes then condition becomes true. (A <= B) is true

Comparison Operators

Comparison operators are used for comparing one expression to another. The result is always either TRUE, FALSE or NULL.

Show Examples

Operator Description Example
LIKE The LIKE operator compares a character, string, or CLOB value to a pattern and returns TRUE if the value matches the pattern and FALSE if it does not. If 'Zara Ali' like 'Z% A_i' returns a Boolean true, whereas, 'Nuha Ali' like 'Z% A_i' returns a Boolean false.
BETWEEN The BETWEEN operator tests whether a value lies in a specified range. x BETWEEN a AND b means that x >= a and x <= b. If x = 10 then, x between 5 and 20 returns true, x between 5 and 10 returns true, but x between 11 and 20 returns false.
IN The IN operator tests set membership. x IN (set) means that x is equal to any member of set. If x = 'm' then, x in ('a', 'b', 'c') returns Boolean false but x in ('m', 'n', 'o') returns Boolean true.
IS NULL The IS NULL operator returns the BOOLEAN value TRUE if its operand is NULL or FALSE if it is not NULL. Comparisons involving NULL values always yield NULL. If x = 'm', then 'x is null' returns Boolean false.

Logical Operators

Following table shows the Logical operators supported by PL/SQL. All these operators work on Boolean operands and produce Boolean results. Let us assume variable A holds true and variable B holds false, then −

Show Examples

Operator Description Examples
and Called the logical AND operator. If both the operands are true then condition becomes true. (A and B) is false.
or Called the logical OR Operator. If any of the two operands is true then condition becomes true. (A or B) is true.
not Called the logical NOT Operator. Used to reverse the logical state of its operand. If a condition is true then Logical NOT operator will make it false. not (A and B) is true.

PL/SQL Operator Precedence

Operator precedence determines the grouping of terms in an expression. This affects how an expression is evaluated. Certain operators have higher precedence than others; for example, the multiplication operator has higher precedence than the addition operator.

For example, x = 7 + 3 * 2; here, x is assigned 13, not 20 because operator * has higher precedence than +, so it first gets multiplied with 3*2 and then adds into 7.

Here, operators with the highest precedence appear at the top of the table, those with the lowest appear at the bottom. Within an expression, higher precedence operators will be evaluated first.

The precedence of operators goes as follows: =, <, >, <=, >=, <>, !=, ~=, ^=, IS NULL, LIKE, BETWEEN, IN.

Show Examples

Operator Operation
** exponentiation
+, - identity, negation
*, / multiplication, division
+, -, || addition, subtraction, concatenation
comparison
NOT logical negation
AND conjunction
OR inclusion

In this chapter, we will discuss conditions in PL/SQL. Decision-making structures require that the programmer specify one or more conditions to be evaluated or tested by the program, along with a statement or statements to be executed if the condition is determined to be true, and optionally, other statements to be executed if the condition is determined to be false.

Following is the general form of a typical conditional (i.e., decision making) structure found in most of the programming languages −

PL/SQL programming language provides following types of decision-making statements. Click the following links to check their detail.

S.No Statement & Description
1 IF - THEN statement

The IF statement associates a condition with a sequence of statements enclosed by the keywords THEN and END IF. If the condition is true, the statements get executed and if the condition is false or NULL then the IF statement does nothing.

2 IF-THEN-ELSE statement

IF statement adds the keyword ELSE followed by an alternative sequence of statement. If the condition is false or NULL, then only the alternative sequence of statements get executed. It ensures that either of the sequence of statements is executed.

3 IF-THEN-ELSIF statement

It allows you to choose between several alternatives.

4 Case statement

Like the IF statement, the CASE statement selects one sequence of statements to execute.

However, to select the sequence, the CASE statement uses a selector rather than multiple Boolean expressions. A selector is an expression whose value is used to select one of several alternatives.

5 Searched CASE statement

The searched CASE statement has no selector, and it's WHEN clauses contain search conditions that yield Boolean values.

6 nested IF-THEN-ELSE

You can use one IF-THEN or IF-THEN-ELSIF statement inside another IF-THEN or IF-THEN-ELSIF statement(s).

In this chapter, we will discuss Loops in PL/SQL. There may be a situation when you need to execute a block of code several number of times. In general, statements are executed sequentially: The first statement in a function is executed first, followed by the second, and so on.

Programming languages provide various control structures that allow for more complicated execution paths.

A loop statement allows us to execute a statement or group of statements multiple times and following is the general form of a loop statement in most of the programming languages −

PL/SQL provides the following types of loop to handle the looping requirements. Click the following links to check their detail.

S.No Loop Type & Description
1 PL/SQL Basic LOOP

In this loop structure, sequence of statements is enclosed between the LOOP and the END LOOP statements. At each iteration, the sequence of statements is executed and then control resumes at the top of the loop.

2 PL/SQL WHILE LOOP

Repeats a statement or group of statements while a given condition is true. It tests the condition before executing the loop body.

3 PL/SQL FOR LOOP

Execute a sequence of statements multiple times and abbreviates the code that manages the loop variable.

4 Nested loops in PL/SQL

You can use one or more loop inside any another basic loop, while, or for loop.

Labeling a PL/SQL Loop

PL/SQL loops can be labeled. The label should be enclosed by double angle brackets (<< and >>) and appear at the beginning of the LOOP statement. The label name can also appear at the end of the LOOP statement. You may use the label in the EXIT statement to exit from the loop.

The following program illustrates the concept −

DECLARE 
   i number(1); 
   j number(1); 
BEGIN 
   << outer_loop >> 
   FOR i IN 1..3 LOOP 
      << inner_loop >> 
      FOR j IN 1..3 LOOP 
         dbms_output.put_line('i is: '|| i || ' and j is: ' || j); 
      END loop inner_loop; 
   END loop outer_loop; 
END; 
/

When the above code is executed at the SQL prompt, it produces the following result −

i is: 1 and j is: 1 
i is: 1 and j is: 2 
i is: 1 and j is: 3 
i is: 2 and j is: 1 
i is: 2 and j is: 2 
i is: 2 and j is: 3 
i is: 3 and j is: 1 
i is: 3 and j is: 2 
i is: 3 and j is: 3  

PL/SQL procedure successfully completed.

The Loop Control Statements

Loop control statements change execution from its normal sequence. When execution leaves a scope, all automatic objects that were created in that scope are destroyed.

PL/SQL supports the following control statements. Labeling loops also help in taking the control outside a loop. Click the following links to check their details.

S.No Control Statement & Description
1 EXIT statement

The Exit statement completes the loop and control passes to the statement immediately after the END LOOP.

2 CONTINUE statement

Causes the loop to skip the remainder of its body and immediately retest its condition prior to reiterating.

3 GOTO statement

Transfers control to the labeled statement. Though it is not advised to use the GOTO statement in your program.

The string in PL/SQL is actually a sequence of characters with an optional size specification. The characters could be numeric, letters, blank, special characters or a combination of all. PL/SQL offers three kinds of strings −

  • Fixed-length strings − In such strings, programmers specify the length while declaring the string. The string is right-padded with spaces to the length so specified.

  • Variable-length strings − In such strings, a maximum length up to 32,767, for the string is specified and no padding takes place.

  • Character large objects (CLOBs) − These are variable-length strings that can be up to 128 terabytes.

PL/SQL strings could be either variables or literals. A string literal is enclosed within quotation marks. For example,

'This is a string literal.' Or 'hello world'

To include a single quote inside a string literal, you need to type two single quotes next to one another. For example,

'this isn''t what it looks like'

Declaring String Variables

Oracle database provides numerous string datatypes, such as CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB, and NCLOB. The datatypes prefixed with an 'N' are 'national character set' datatypes, that store Unicode character data.

If you need to declare a variable-length string, you must provide the maximum length of that string. For example, the VARCHAR2 data type. The following example illustrates declaring and using some string variables −

DECLARE 
   name varchar2(20); 
   company varchar2(30); 
   introduction clob; 
   choice char(1); 
BEGIN 
   name := 'John Smith'; 
   company := 'Infotech'; 
   introduction := ' Hello! I''m John Smith from Infotech.'; 
   choice := 'y'; 
   IF choice = 'y' THEN 
      dbms_output.put_line(name); 
      dbms_output.put_line(company); 
      dbms_output.put_line(introduction); 
   END IF; 
END; 
/

When the above code is executed at the SQL prompt, it produces the following result −

John Smith 
Infotech
Hello! I'm John Smith from Infotech.  

PL/SQL procedure successfully completed

To declare a fixed-length string, use the CHAR datatype. Here you do not have to specify a maximum length for a fixed-length variable. If you leave off the length constraint, Oracle Database automatically uses a maximum length required. The following two declarations are identical −

red_flag CHAR(1) := 'Y'; 
 red_flag CHAR   := 'Y';

PL/SQL String Functions and Operators

PL/SQL offers the concatenation operator (||) for joining two strings. The following table provides the string functions provided by PL/SQL −

S.No Function & Purpose
1

ASCII(x);

Returns the ASCII value of the character x.

2

CHR(x);

Returns the character with the ASCII value of x.

3

CONCAT(x, y);

Concatenates the strings x and y and returns the appended string.

4

INITCAP(x);

Converts the initial letter of each word in x to uppercase and returns that string.

5

INSTR(x, find_string [, start] [, occurrence]);

Searches for find_string in x and returns the position at which it occurs.

6

INSTRB(x);

Returns the location of a string within another string, but returns the value in bytes.

7

LENGTH(x);

Returns the number of characters in x.

8

LENGTHB(x);

Returns the length of a character string in bytes for single byte character set.

9

LOWER(x);

Converts the letters in x to lowercase and returns that string.

10

LPAD(x, width [, pad_string]) ;

Pads x with spaces to the left, to bring the total length of the string up to width characters.

11

LTRIM(x [, trim_string]);

Trims characters from the left of x.

12

NANVL(x, value);

Returns value if x matches the NaN special value (not a number), otherwise x is returned.

13

NLS_INITCAP(x);

Same as the INITCAP function except that it can use a different sort method as specified by NLSSORT.

14

NLS_LOWER(x) ;

Same as the LOWER function except that it can use a different sort method as specified by NLSSORT.

15

NLS_UPPER(x);

Same as the UPPER function except that it can use a different sort method as specified by NLSSORT.

16

NLSSORT(x);

Changes the method of sorting the characters. Must be specified before any NLS function; otherwise, the default sort will be used.

17

NVL(x, value);

Returns value if x is null; otherwise, x is returned.

18

NVL2(x, value1, value2);

Returns value1 if x is not null; if x is null, value2 is returned.

19

REPLACE(x, search_string, replace_string);

Searches x for search_string and replaces it with replace_string.

20

RPAD(x, width [, pad_string]);

Pads x to the right.

21

RTRIM(x [, trim_string]);

Trims x from the right.

22

SOUNDEX(x) ;

Returns a string containing the phonetic representation of x.

23

SUBSTR(x, start [, length]);

Returns a substring of x that begins at the position specified by start. An optional length for the substring may be supplied.

24

SUBSTRB(x);

Same as SUBSTR except that the parameters are expressed in bytes instead of characters for the single-byte character systems.

25

TRIM([trim_char FROM) x);

Trims characters from the left and right of x.

26

UPPER(x);

Converts the letters in x to uppercase and returns that string.

概念を理解するために、いくつかの例を考えてみましょう。

例1

DECLARE 
   greetings varchar2(11) := 'hello world'; 
BEGIN 
   dbms_output.put_line(UPPER(greetings)); 
    
   dbms_output.put_line(LOWER(greetings)); 
    
   dbms_output.put_line(INITCAP(greetings)); 
    
   /* retrieve the first character in the string */ 
   dbms_output.put_line ( SUBSTR (greetings, 1, 1)); 
    
   /* retrieve the last character in the string */ 
   dbms_output.put_line ( SUBSTR (greetings, -1, 1)); 
    
   /* retrieve five characters,  
      starting from the seventh position. */ 
   dbms_output.put_line ( SUBSTR (greetings, 7, 5)); 
    
   /* retrieve the remainder of the string, 
      starting from the second position. */ 
   dbms_output.put_line ( SUBSTR (greetings, 2)); 
     
   /* find the location of the first "e" */ 
   dbms_output.put_line ( INSTR (greetings, 'e')); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

HELLO WORLD 
hello world 
Hello World 
h 
d 
World 
ello World 
2  

PL/SQL procedure successfully completed.

例2

DECLARE 
   greetings varchar2(30) := '......Hello World.....'; 
BEGIN 
   dbms_output.put_line(RTRIM(greetings,'.')); 
   dbms_output.put_line(LTRIM(greetings, '.')); 
   dbms_output.put_line(TRIM( '.' from greetings)); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

......Hello World  
Hello World..... 
Hello World  

PL/SQL procedure successfully completed.

この章では、PL / SQLの配列について説明します。PL / SQLプログラミング言語は、と呼ばれるデータ構造を提供します。VARRAY、同じタイプの要素の固定サイズの順次コレクションを格納できます。配列はデータの順序付けられたコレクションを格納するために使用されますが、配列を同じタイプの変数のコレクションと考える方がよい場合がよくあります。

すべてのVARRAYは、連続したメモリ位置で構成されます。最小アドレスは最初の要素に対応し、最大アドレスは最後の要素に対応します。

配列はコレクション型データの一部であり、可変サイズ配列を表します。他のコレクションタイプについては、後の章で説明します。'PL/SQL Collections'

の各要素 varrayインデックスが関連付けられています。また、動的に変更できる最大サイズもあります。

Varrayタイプの作成

VARRAYタイプは、 CREATE TYPEステートメント。VARRAYに格納される要素の最大サイズとタイプを指定する必要があります。

スキーマレベルでVARRAYタイプを作成するための基本的な構文は次のとおりです。

CREATE OR REPLACE TYPE varray_type_name IS VARRAY(n) of <element_type>

どこ、

  • varray_type_nameは有効な属性名であり、
  • nは、VARRAY内の要素の数(最大)です。
  • element_typeは、配列の要素のデータ型です。

VARRAYの最大サイズは、 ALTER TYPE ステートメント。

例えば、

CREATE Or REPLACE TYPE namearray AS VARRAY(3) OF VARCHAR2(10); 
/ 

Type created.

PL / SQLブロック内にVARRAYタイプを作成するための基本的な構文は次のとおりです。

TYPE varray_type_name IS VARRAY(n) of <element_type>

例-

TYPE namearray IS VARRAY(5) OF VARCHAR2(10); 
Type grades IS VARRAY(5) OF INTEGER;

概念を理解するために、いくつかの例を考えてみましょう。

例1

次のプログラムは、VARRAYの使用法を示しています。

DECLARE 
   type namesarray IS VARRAY(5) OF VARCHAR2(10); 
   type grades IS VARRAY(5) OF INTEGER; 
   names namesarray; 
   marks grades; 
   total integer; 
BEGIN 
   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); 
   marks:= grades(98, 97, 78, 87, 92); 
   total := names.count; 
   dbms_output.put_line('Total '|| total || ' Students'); 
   FOR i in 1 .. total LOOP 
      dbms_output.put_line('Student: ' || names(i) || ' 
      Marks: ' || marks(i)); 
   END LOOP; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Total 5 Students 
Student: Kavita  Marks: 98 
Student: Pritam  Marks: 97 
Student: Ayan  Marks: 78 
Student: Rishav  Marks: 87 
Student: Aziz  Marks: 92 

PL/SQL procedure successfully completed.

Please note

  • Oracle環境では、VARRAYの開始インデックスは常に1です。

  • VARRAYと同じ名前のVARRAYタイプのコンストラクターメソッドを使用して、VARRAY要素を初期化できます。

  • Varrayは1次元配列です。

  • varrayは、宣言されると自動的にNULLになり、その要素を参照する前に初期化する必要があります。

例2

VARRAYの要素は、任意のデータベース表の%ROWTYPEまたは任意のデータベース表フィールドの%TYPEにすることもできます。次の例は、概念を示しています。

データベースに格納されているCUSTOMERSテーブルを-として使用します。

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

次の例では、 cursor、これについては別の章で詳しく学習します。

DECLARE 
   CURSOR c_customers is 
   SELECT  name FROM customers; 
   type c_list is varray (6) of customers.name%type; 
   name_list c_list := c_list(); 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter + 1; 
      name_list.extend; 
      name_list(counter)  := n.name; 
      dbms_output.put_line('Customer('||counter ||'):'||name_list(counter)); 
   END LOOP; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed.

この章では、PL / SQLのプロシージャについて説明します。Asubprogram特定のタスクを実行するプログラムユニット/モジュールです。これらのサブプログラムを組み合わせて、より大きなプログラムを形成します。これは基本的に「モジュラーデザイン」と呼ばれます。サブプログラムは、別のサブプログラムまたはプログラムと呼ばれるプログラムによって呼び出すことができます。calling program

サブプログラムを作成できます-

  • スキーマレベルで
  • パッケージ内
  • PL / SQLブロック内

スキーマレベルでは、サブプログラムは standalone subprogram。これは、CREATEPROCEDUREまたはCREATEFUNCTIONステートメントで作成されます。これはデータベースに保管され、DROPPROCEDUREまたはDROPFUNCTIONステートメントで削除できます。

パッケージ内に作成されたサブプログラムは packaged subprogram。これはデータベースに保管されており、DROPPACKAGEステートメントでパッケージが削除された場合にのみ削除できます。この章でパッケージについて説明します'PL/SQL - Packages'

PL / SQLサブプログラムは、パラメータのセットを使用して呼び出すことができるPL / SQLブロックと呼ばれます。PL / SQLは2種類のサブプログラムを提供します-

  • Functions−これらのサブプログラムは単一の値を返します。主に値を計算して返すために使用されます。

  • Procedures−これらのサブプログラムは値を直接返しません。主にアクションを実行するために使用されます。

この章では、の重要な側面について説明します。 PL/SQL procedure。私たちは議論する予定ですPL/SQL function 次の章で。

PL / SQLサブプログラムの一部

各PL / SQLサブプログラムには名前があり、パラメータリストがある場合もあります。匿名のPL / SQLブロックと同様に、名前付きブロックにも次の3つの部分があります。

S.No 部品と説明
1

Declarative Part

オプションパーツです。ただし、サブプログラムの宣言部分はDECLAREキーワードで始まりません。これには、型、カーソル、定数、変数、例外、およびネストされたサブプログラムの宣言が含まれています。これらの項目はサブプログラムに対してローカルであり、サブプログラムが実行を完了すると存在しなくなります。

2

Executable Part

これは必須の部分であり、指定されたアクションを実行するステートメントが含まれています。

3

Exception-handling

これもオプションパーツです。実行時エラーを処理するコードが含まれています。

プロシージャの作成

プロシージャは、 CREATE OR REPLACE PROCEDUREステートメント。CREATE OR REPLACEPROCEDUREステートメントの簡略化された構文は次のとおりです。

CREATE [OR REPLACE] PROCEDURE procedure_name 
[(parameter_name [IN | OUT | IN OUT] type [, ...])] 
{IS | AS} 
BEGIN 
  < procedure_body > 
END procedure_name;

どこ、

  • procedure-nameは、プロシージャーの名前を指定します。

  • [OR REPLACE]オプションを使用すると、既存のプロシージャを変更できます。

  • オプションのパラメータリストには、パラメータの名前、モード、およびタイプが含まれています。 IN は外部から渡される値を表し、OUTはプロシージャの外部で値を返すために使用されるパラメータを表します。

  • procedure-bodyには、実行可能部分が含まれています。

  • スタンドアロンプ​​ロシージャを作成するために、ISキーワードの代わりにASキーワードが使用されます。

次の例では、文字列「HelloWorld!」を表示する簡単なプロシージャを作成します。実行時に画面に表示されます。

CREATE OR REPLACE PROCEDURE greetings 
AS 
BEGIN 
   dbms_output.put_line('Hello World!'); 
END; 
/

上記のコードをSQLプロンプトを使用して実行すると、次の結果が生成されます。

Procedure created.

スタンドアロン手順の実行

スタンドアロンプ​​ロシージャは、2つの方法で呼び出すことができます-

  • を使用して EXECUTE キーワード

  • PL / SQLブロックからプロシージャの名前を呼び出す

上記の手順 'greetings' EXECUTEキーワードを使用して-として呼び出すことができます

EXECUTE greetings;

上記の呼び出しは表示されます-

Hello World

PL/SQL procedure successfully completed.

プロシージャは、別のPL / SQLブロックから呼び出すこともできます-

BEGIN 
   greetings; 
END; 
/

上記の呼び出しは表示されます-

Hello World  

PL/SQL procedure successfully completed.

スタンドアロンプ​​ロシージャの削除

スタンドアロンプ​​ロシージャは、 DROP PROCEDUREステートメント。プロシージャを削除するための構文は次のとおりです。

DROP PROCEDURE procedure-name;

次のステートメントを使用して、グリーティング手順を削除できます。

DROP PROCEDURE greetings;

PL / SQLサブプログラムのパラメータモード

次の表に、PL / SQLサブプログラムのパラメータモードを示します。

S.No パラメータモードと説明
1

IN

INパラメーターを使用すると、サブプログラムに値を渡すことができます。 It is a read-only parameter。サブプログラム内では、INパラメーターは定数のように機能します。値を割り当てることはできません。定数、リテラル、初期化された変数、または式をINパラメーターとして渡すことができます。デフォルト値に初期化することもできます。ただし、その場合はサブプログラム呼び出しから省略されます。It is the default mode of parameter passing. Parameters are passed by reference

2

OUT

OUTパラメータは、呼び出し元のプログラムに値を返します。サブプログラム内では、OUTパラメータは変数のように機能します。値を変更し、割り当てた後で値を参照できます。The actual parameter must be variable and it is passed by value

3

IN OUT

アン IN OUTパラメータは初期値をサブプログラムに渡し、更新された値を呼び出し元に返します。値を割り当てたり、値を読み取ったりすることができます。

IN OUT仮パラメータに対応する実際のパラメータは、定数や式ではなく、変数である必要があります。正式なパラメータには値を割り当てる必要があります。Actual parameter is passed by value.

IN&OUTモードの例1

このプログラムは、最小2つの値を見つけます。ここで、プロシージャはINモードを使用して2つの数値を取り、OUTパラメータを使用してそれらの最小値を返します。

DECLARE 
   a number; 
   b number; 
   c number;
PROCEDURE findMin(x IN number, y IN number, z OUT number) IS 
BEGIN 
   IF x < y THEN 
      z:= x; 
   ELSE 
      z:= y; 
   END IF; 
END;   
BEGIN 
   a:= 23; 
   b:= 45; 
   findMin(a, b, c); 
   dbms_output.put_line(' Minimum of (23, 45) : ' || c); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Minimum of (23, 45) : 23  

PL/SQL procedure successfully completed.

IN&OUTモードの例2

このプロシージャは、渡された値の値の2乗を計算します。この例は、同じパラメーターを使用して値を受け入れ、別の結果を返す方法を示しています。

DECLARE 
   a number; 
PROCEDURE squareNum(x IN OUT number) IS 
BEGIN 
  x := x * x; 
END;  
BEGIN 
   a:= 23; 
   squareNum(a); 
   dbms_output.put_line(' Square of (23): ' || a); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Square of (23): 529 

PL/SQL procedure successfully completed.

パラメータを渡すためのメソッド

実際のパラメータは3つの方法で渡すことができます-

  • 位置表記
  • 名前付き表記
  • 混合表記

位置表記

位置表記では、プロシージャを次のように呼び出すことができます。

findMin(a, b, c, d);

位置表記では、最初の実パラメータが最初の仮パラメータに置き換えられます。2番目の実パラメータが2番目の仮パラメータに置き換えられ、以下同様に続きます。そう、a の代わりに x, b の代わりに y, c の代わりに z そして d の代わりに m

名前付き表記

名前付き表記では、実際のパラメーターは、を使用して仮パラメーターに関連付けられます。 arrow symbol ( => )。プロシージャコールは次のようになります-

findMin(x => a, y => b, z => c, m => d);

混合表記

混合表記では、プロシージャコールで両方の表記を混合できます。ただし、位置表記は名前付き表記の前に置く必要があります。

次の呼び出しは合法です-

findMin(a, b, c, m => d);

ただし、これは合法ではありません。

findMin(x => a, b, c, d);

この章では、PL / SQLの関数について説明します。関数は、値を返すことを除いて、プロシージャと同じです。したがって、前の章のすべての説明は関数にも当てはまります。

関数の作成

スタンドアロン関数は、を使用して作成されます CREATE FUNCTIONステートメント。の簡略化された構文CREATE OR REPLACE PROCEDURE ステートメントは次のとおりです-

CREATE [OR REPLACE] FUNCTION function_name 
[(parameter_name [IN | OUT | IN OUT] type [, ...])] 
RETURN return_datatype 
{IS | AS} 
BEGIN 
   < function_body > 
END [function_name];

どこ、

  • function-nameは、関数の名前を指定します。

  • [OR REPLACE]オプションを使用すると、既存の機能を変更できます。

  • オプションのパラメータリストには、パラメータの名前、モード、およびタイプが含まれています。INは外部から渡される値を表し、OUTはプロシージャの外部で値を返すために使用されるパラメータを表します。

  • 関数には、 return ステートメント。

  • RETURNの句は、関数から戻るしようとしているデータのタイプを指定します。

  • function-bodyには、実行可能部分が含まれています。

  • スタンドアロン関数を作成するために、ISキーワードの代わりにASキーワードが使用されます。

次の例は、スタンドアロン関数を作成して呼び出す方法を示しています。この関数は、customersテーブル内のCUSTOMERSの総数を返します。

PL / SQL変数の章で作成したCUSTOMERS表を使用します。

Select * from customers; 
 
+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+
CREATE OR REPLACE FUNCTION totalCustomers 
RETURN number IS 
   total number(2) := 0; 
BEGIN 
   SELECT count(*) into total 
   FROM customers; 
    
   RETURN total; 
END; 
/

上記のコードをSQLプロンプトを使用して実行すると、次の結果が生成されます。

Function created.

関数の呼び出し

関数を作成するときに、関数が何をしなければならないかを定義します。関数を使用するには、その関数を呼び出して定義されたタスクを実行する必要があります。プログラムが関数を呼び出すと、プログラム制御は呼び出された関数に移されます。

呼び出された関数は、定義されたタスクを実行し、そのreturnステートメントが実行されたとき、または last end statement に達すると、プログラム制御をメインプログラムに戻します。

関数を呼び出すには、必要なパラメーターを関数名と一緒に渡すだけで、関数が値を返す場合は、戻り値を保存できます。次のプログラムは関数を呼び出しますtotalCustomers 匿名ブロックから-

DECLARE 
   c number(2); 
BEGIN 
   c := totalCustomers(); 
   dbms_output.put_line('Total no. of Customers: ' || c); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Total no. of Customers: 6  

PL/SQL procedure successfully completed.

次の例は、最大2つの値を計算して返す単純なPL / SQL関数の宣言、定義、および呼び出しを示しています。

DECLARE 
   a number; 
   b number; 
   c number; 
FUNCTION findMax(x IN number, y IN number)  
RETURN number 
IS 
    z number; 
BEGIN 
   IF x > y THEN 
      z:= x; 
   ELSE 
      Z:= y; 
   END IF;  
   RETURN z; 
END; 
BEGIN 
   a:= 23; 
   b:= 45;  
   c := findMax(a, b); 
   dbms_output.put_line(' Maximum of (23,45): ' || c); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Maximum of (23,45): 45   

PL/SQL procedure successfully completed.

PL / SQL再帰関数

プログラムまたはサブプログラムが別のサブプログラムを呼び出す可能性があることを確認しました。サブプログラムがそれ自体を呼び出すとき、それは再帰呼び出しと呼ばれ、プロセスは次のように知られています。recursion

概念を説明するために、数値の階乗を計算してみましょう。数nの階乗は次のように定義されます-

n! = n*(n-1)! 
   = n*(n-1)*(n-2)! 
      ... 
   = n*(n-1)*(n-2)*(n-3)... 1

次のプログラムは、それ自体を再帰的に呼び出すことによって、指定された数の階乗を計算します-

DECLARE 
   num number; 
   factorial number;  
   
FUNCTION fact(x number) 
RETURN number  
IS 
   f number; 
BEGIN 
   IF x=0 THEN 
      f := 1; 
   ELSE 
      f := x * fact(x-1); 
   END IF; 
RETURN f; 
END;  

BEGIN 
   num:= 6; 
   factorial := fact(num); 
   dbms_output.put_line(' Factorial '|| num || ' is ' || factorial); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Factorial 6 is 720 
  
PL/SQL procedure successfully completed.

この章では、PL / SQLのカーソルについて説明します。Oracleは、SQL文を処理するために、コンテキスト領域と呼ばれるメモリ領域を作成します。この領域には、文の処理に必要なすべての情報が含まれています。たとえば、処理された行数など。

A cursorこのコンテキスト領域へのポインタです。PL / SQLは、カーソルを介してコンテキスト領域を制御します。カーソルは、SQLステートメントによって返される行(1つ以上)を保持します。カーソルが保持する行のセットは、active set

プログラムで参照できるようにカーソルに名前を付けて、SQLステートメントによって返された行を一度に1つずつフェッチして処理することができます。カーソルには2つのタイプがあります-

  • 暗黙カーソル
  • 明示カーソル

暗黙カーソル

暗黙カーソルは、SQLステートメントが実行されるたびに、ステートメントに明示カーソルがない場合にOracleによって自動的に作成されます。プログラマーは、暗黙カーソルとその中の情報を制御できません。

DMLステートメント(INSERT、UPDATE、およびDELETE)が発行されるたびに、暗黙カーソルがこのステートメントに関連付けられます。INSERT操作の場合、カーソルは挿入する必要のあるデータを保持します。UPDATEおよびDELETE操作の場合、カーソルは影響を受ける行を識別します。

PL / SQLでは、最新の暗黙カーソルを次のように参照できます。 SQL cursor、常に次のような属性があります %FOUND, %ISOPEN, %NOTFOUND、および %ROWCOUNT。SQLカーソルには追加の属性があります。%BULK_ROWCOUNT そして %BULK_EXCEPTIONS、で使用するために設計されています FORALLステートメント。次の表に、最もよく使用される属性の説明を示します-

S.No 属性と説明
1

%FOUND

INSERT、UPDATE、またはDELETEステートメントが1つ以上の行に影響を与えた場合、またはSELECT INTOステートメントが1つ以上の行を返した場合、TRUEを返します。それ以外の場合は、FALSEを返します。

2

%NOTFOUND

%FOUNDの論理的な反対。INSERT、UPDATE、またはDELETEステートメントが行に影響を与えなかった場合、またはSELECT INTOステートメントが行を返さなかった場合は、TRUEを返します。それ以外の場合は、FALSEを返します。

3

%ISOPEN

Oracleは関連するSQLステートメントの実行後にSQLカーソルを自動的に閉じるため、暗黙カーソルに対しては常にFALSEを返します。

4

%ROWCOUNT

INSERT、UPDATE、またはDELETEステートメントの影響を受ける行数、またはSELECTINTOステートメントによって返される行数を返します。

すべてのSQLカーソル属性は次のようにアクセスされます sql%attribute_name 以下の例に示すように。

前の章で作成して使用したCUSTOMERSテーブルを使用します。

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

次のプログラムは、テーブルを更新し、各顧客の給与を500増やし、 SQL%ROWCOUNT 影響を受ける行数を決定する属性-

DECLARE  
   total_rows number(2); 
BEGIN 
   UPDATE customers 
   SET salary = salary + 500; 
   IF sql%notfound THEN 
      dbms_output.put_line('no customers selected'); 
   ELSIF sql%found THEN 
      total_rows := sql%rowcount;
      dbms_output.put_line( total_rows || ' customers selected '); 
   END IF;  
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

6 customers selected  

PL/SQL procedure successfully completed.

Customersテーブルのレコードを確認すると、行が更新されていることがわかります-

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2500.00 | 
|  2 | Khilan   |  25 | Delhi     |  2000.00 | 
|  3 | kaushik  |  23 | Kota      |  2500.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7000.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9000.00 | 
|  6 | Komal    |  22 | MP        |  5000.00 | 
+----+----------+-----+-----------+----------+

明示カーソル

明示カーソルは、プログラマー定義のカーソルであり、 context area。PL / SQLブロックの宣言セクションで明示カーソルを定義する必要があります。これは、複数の行を返すSELECTステートメントで作成されます。

明示カーソルを作成するための構文は次のとおりです。

CURSOR cursor_name IS select_statement;

明示カーソルの操作には、次の手順が含まれます-

  • メモリを初期化するためのカーソルの宣言
  • メモリを割り当てるためにカーソルを開く
  • データを取得するためのカーソルの取得
  • カーソルを閉じて、割り当てられたメモリを解放します

カーソルの宣言

カーソルを宣言すると、カーソルとそれに関連するSELECTステートメントが定義されます。例-

CURSOR c_customers IS 
   SELECT id, name, address FROM customers;

カーソルを開く

カーソルを開くと、カーソルにメモリが割り当てられ、SQLステートメントによって返された行をカーソルにフェッチできるようになります。たとえば、上記で定義したカーソルを次のように開きます-

OPEN c_customers;

カーソルのフェッチ

カーソルを取得するには、一度に1行にアクセスする必要があります。たとえば、上で開いたカーソルから次のように行をフェッチします-

FETCH c_customers INTO c_id, c_name, c_addr;

カーソルを閉じる

カーソルを閉じるとは、割り当てられたメモリを解放することを意味します。たとえば、上で開いたカーソルを次のように閉じます-

CLOSE c_customers;

以下は、明示カーソル&minua;の概念を説明するための完全な例です。

DECLARE 
   c_id customers.id%type; 
   c_name customer.name%type; 
   c_addr customers.address%type; 
   CURSOR c_customers is 
      SELECT id, name, address FROM customers; 
BEGIN 
   OPEN c_customers; 
   LOOP 
   FETCH c_customers into c_id, c_name, c_addr; 
      EXIT WHEN c_customers%notfound; 
      dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr); 
   END LOOP; 
   CLOSE c_customers; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

1 Ramesh Ahmedabad  
2 Khilan Delhi  
3 kaushik Kota     
4 Chaitali Mumbai  
5 Hardik Bhopal   
6 Komal MP  
  
PL/SQL procedure successfully completed.

この章では、PL / SQLのレコードについて説明します。Arecordは、さまざまな種類のデータ項目を保持できるデータ構造です。レコードは、データベーステーブルの行と同様に、さまざまなフィールドで構成されます。

たとえば、図書館で本を追跡したいとします。タイトル、著者、件名、本IDなど、各本に関する次の属性を追跡することをお勧めします。これらの各項目のフィールドを含むレコードを使用すると、BOOKを論理単位として扱うことができ、その情報をより適切に整理して表すことができます。

PL / SQLは、次のタイプのレコードを処理できます-

  • Table-based
  • カーソルベースのレコード
  • ユーザー定義のレコード

テーブルベースのレコード

%ROWTYPE属性を使用すると、プログラマーは作成できます table-based そして cursorbased 記録。

次の例は、 table-based記録。前の章で作成して使用したCUSTOMERSテーブルを使用します-

DECLARE 
   customer_rec customers%rowtype; 
BEGIN 
   SELECT * into customer_rec 
   FROM customers 
   WHERE id = 5;  
   dbms_output.put_line('Customer ID: ' || customer_rec.id); 
   dbms_output.put_line('Customer Name: ' || customer_rec.name); 
   dbms_output.put_line('Customer Address: ' || customer_rec.address); 
   dbms_output.put_line('Customer Salary: ' || customer_rec.salary); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Customer ID: 5 
Customer Name: Hardik 
Customer Address: Bhopal 
Customer Salary: 9000 
 
PL/SQL procedure successfully completed.

カーソルベースのレコード

次の例は、 cursor-based記録。前の章で作成して使用したCUSTOMERSテーブルを使用します-

DECLARE 
   CURSOR customer_cur is 
      SELECT id, name, address  
      FROM customers; 
   customer_rec customer_cur%rowtype; 
BEGIN 
   OPEN customer_cur; 
   LOOP 
      FETCH customer_cur into customer_rec; 
      EXIT WHEN customer_cur%notfound; 
      DBMS_OUTPUT.put_line(customer_rec.id || ' ' || customer_rec.name); 
   END LOOP; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

1 Ramesh 
2 Khilan 
3 kaushik 
4 Chaitali 
5 Hardik 
6 Komal  

PL/SQL procedure successfully completed.

ユーザー定義のレコード

PL / SQLは、さまざまなレコード構造を定義できるユーザー定義のレコード型を提供します。これらのレコードは、さまざまなフィールドで構成されています。図書館で本を追跡したいとします。各本に関する次の属性を追跡することをお勧めします-

  • Title
  • Author
  • Subject
  • ブックID

レコードの定義

レコードタイプは次のように定義されます-

TYPE 
type_name IS RECORD 
  ( field_name1  datatype1  [NOT NULL]  [:= DEFAULT EXPRESSION], 
   field_name2   datatype2   [NOT NULL]  [:= DEFAULT EXPRESSION], 
   ... 
   field_nameN  datatypeN  [NOT NULL]  [:= DEFAULT EXPRESSION); 
record-name  type_name;

ブックレコードは次のように宣言されます-

DECLARE 
TYPE books IS RECORD 
(title  varchar(50), 
   author  varchar(50), 
   subject varchar(100), 
   book_id   number); 
book1 books; 
book2 books;

フィールドへのアクセス

レコードの任意のフィールドにアクセスするには、ドットを使用します (.)オペレーター。メンバーアクセス演算子は、レコード変数名とアクセスするフィールドの間のピリオドとしてコード化されます。以下は、レコードの使用法を説明する例です。

DECLARE 
   type books is record 
      (title varchar(50), 
      author varchar(50), 
      subject varchar(100), 
      book_id number); 
   book1 books; 
   book2 books; 
BEGIN 
   -- Book 1 specification 
   book1.title  := 'C Programming'; 
   book1.author := 'Nuha Ali ';  
   book1.subject := 'C Programming Tutorial'; 
   book1.book_id := 6495407;  
   -- Book 2 specification 
   book2.title := 'Telecom Billing'; 
   book2.author := 'Zara Ali'; 
   book2.subject := 'Telecom Billing Tutorial'; 
   book2.book_id := 6495700;  
  
  -- Print book 1 record 
   dbms_output.put_line('Book 1 title : '|| book1.title); 
   dbms_output.put_line('Book 1 author : '|| book1.author); 
   dbms_output.put_line('Book 1 subject : '|| book1.subject); 
   dbms_output.put_line('Book 1 book_id : ' || book1.book_id); 
   
   -- Print book 2 record 
   dbms_output.put_line('Book 2 title : '|| book2.title); 
   dbms_output.put_line('Book 2 author : '|| book2.author); 
   dbms_output.put_line('Book 2 subject : '|| book2.subject); 
   dbms_output.put_line('Book 2 book_id : '|| book2.book_id); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Book 1 title : C Programming 
Book 1 author : Nuha Ali 
Book 1 subject : C Programming Tutorial 
Book 1 book_id : 6495407 
Book 2 title : Telecom Billing 
Book 2 author : Zara Ali 
Book 2 subject : Telecom Billing Tutorial 
Book 2 book_id : 6495700  

PL/SQL procedure successfully completed.

サブプログラムパラメータとして記録

他の変数を渡すのと同じように、レコードをサブプログラムパラメータとして渡すことができます。上記の例でアクセスしたのと同じ方法でレコードフィールドにアクセスすることもできます-

DECLARE 
   type books is record 
      (title  varchar(50), 
      author  varchar(50), 
      subject varchar(100), 
      book_id   number); 
   book1 books; 
   book2 books;  
PROCEDURE printbook (book books) IS 
BEGIN 
   dbms_output.put_line ('Book  title :  ' || book.title); 
   dbms_output.put_line('Book  author : ' || book.author); 
   dbms_output.put_line( 'Book  subject : ' || book.subject); 
   dbms_output.put_line( 'Book book_id : ' || book.book_id); 
END; 
   
BEGIN 
   -- Book 1 specification 
   book1.title  := 'C Programming'; 
   book1.author := 'Nuha Ali ';  
   book1.subject := 'C Programming Tutorial'; 
   book1.book_id := 6495407;
   
   -- Book 2 specification 
   book2.title := 'Telecom Billing'; 
   book2.author := 'Zara Ali'; 
   book2.subject := 'Telecom Billing Tutorial'; 
   book2.book_id := 6495700;  
   
   -- Use procedure to print book info 
   printbook(book1); 
   printbook(book2); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Book  title : C Programming 
Book  author : Nuha Ali 
Book subject : C Programming Tutorial 
Book  book_id : 6495407 
Book title : Telecom Billing 
Book author : Zara Ali 
Book subject : Telecom Billing Tutorial 
Book book_id : 6495700  

PL/SQL procedure successfully completed.

この章では、PL / SQLの例外について説明します。例外は、プログラム実行中のエラー状態です。PL / SQLは、プログラマがEXCEPTIONプログラムでブロックし、エラー状態に対して適切なアクションが実行されます。例外には2つのタイプがあります-

  • システム定義の例外
  • ユーザー定義の例外

例外処理の構文

例外処理の一般的な構文は次のとおりです。ここでは、処理できる限り多くの例外をリストできます。デフォルトの例外は、を使用して処理されますWHEN others THEN

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)> 
EXCEPTION 
   <exception handling goes here > 
   WHEN exception1 THEN  
      exception1-handling-statements  
   WHEN exception2  THEN  
      exception2-handling-statements  
   WHEN exception3 THEN  
      exception3-handling-statements 
   ........ 
   WHEN others THEN 
      exception3-handling-statements 
END;

概念を説明するコードを書いてみましょう。前の章で作成して使用したCUSTOMERSテーブルを使用します-

DECLARE 
   c_id customers.id%type := 8; 
   c_name customerS.Name%type; 
   c_addr customers.address%type; 
BEGIN 
   SELECT  name, address INTO  c_name, c_addr 
   FROM customers 
   WHERE id = c_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name); 
   DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 

EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!'); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

No such customer!  

PL/SQL procedure successfully completed.

上記のプログラムは、IDが与えられた顧客の名前と住所を表示します。データベースにID値8の顧客がいないため、プログラムは実行時例外を発生させますNO_DATA_FOUND、でキャプチャされます EXCEPTION block

例外の発生

内部データベースエラーが発生すると、データベースサーバーによって例外が自動的に発生しますが、プログラマーはコマンドを使用して例外を明示的に発生させることができます。 RAISE。以下は、例外を発生させるための簡単な構文です-

DECLARE 
   exception_name EXCEPTION; 
BEGIN 
   IF condition THEN 
      RAISE exception_name; 
   END IF; 
EXCEPTION 
   WHEN exception_name THEN 
   statement; 
END;

上記の構文を使用して、Oracle標準例外または任意のユーザー定義例外を発生させることができます。次のセクションでは、ユーザー定義の例外を発生させる例を示します。同様の方法で、Oracle標準の例外を発生させることができます。

ユーザー定義の例外

PL / SQLを使用すると、プログラムの必要性に応じて独自の例外を定義できます。ユーザー定義の例外を宣言してから、RAISEステートメントまたはプロシージャを使用して明示的に発生させる必要があります。DBMS_STANDARD.RAISE_APPLICATION_ERROR

例外を宣言するための構文は次のとおりです。

DECLARE 
   my-exception EXCEPTION;

次の例は、概念を示しています。このプログラムは、ユーザーが無効なIDを入力すると、例外として顧客IDを要求します。invalid_id 上げられます。

DECLARE 
   c_id customers.id%type := &cc_id; 
   c_name customerS.Name%type; 
   c_addr customers.address%type;  
   -- user defined exception 
   ex_invalid_id  EXCEPTION; 
BEGIN 
   IF c_id <= 0 THEN 
      RAISE ex_invalid_id; 
   ELSE 
      SELECT  name, address INTO  c_name, c_addr 
      FROM customers 
      WHERE id = c_id;
      DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name);  
      DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 
   END IF; 

EXCEPTION 
   WHEN ex_invalid_id THEN 
      dbms_output.put_line('ID must be greater than zero!'); 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!');  
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Enter value for cc_id: -6 (let's enter a value -6) 
old  2: c_id customers.id%type := &cc_id; 
new  2: c_id customers.id%type := -6; 
ID must be greater than zero! 
 
PL/SQL procedure successfully completed.

事前定義された例外

PL / SQLには多くの事前定義された例外があり、プログラムがデータベースルールに違反した場合に実行されます。たとえば、SELECT INTOステートメントが行を返さない場合、事前定義された例外NO_DATA_FOUNDが発生します。次の表に、事前定義された重要な例外のいくつかを示します。

例外 Oracleエラー SQLCODE 説明
ACCESS_INTO_NULL 06530 -6530 nullオブジェクトに値が自動的に割り当てられると発生します。
CASE_NOT_FOUND 06592 -6592 これは、CASEステートメントのWHEN句の選択肢がどれも選択されておらず、ELSE句がない場合に発生します。
COLLECTION_IS_NULL 06531 -6531 これは、プログラムがEXISTS以外の収集メソッドを初期化されていないネストされたテーブルまたはVARRAYに適用しようとした場合、またはプログラムが初期化されていないネストされたテーブルまたはVARRAYの要素に値を割り当てようとした場合に発生します。
DUP_VAL_ON_INDEX 00001 -1 重複する値を一意のインデックスを持つ列に格納しようとすると発生します。
INVALID_CURSOR 01001 -1001 開いていないカーソルを閉じるなど、許可されていないカーソル操作を行おうとすると発生します。
無効な番号 01722 -1722 文字列が有効な数値を表していないために文字列の数値への変換が失敗した場合に発生します。
LOGIN_DENIED 01017 -1017 プログラムが無効なユーザー名またはパスワードでデータベースにログオンしようとすると発生します。
何もデータが見つかりませんでした 01403 +100 SELECTINTOステートメントが行を返さない場合に発生します。
NOT_LOGGED_ON 01012 -1012 これは、データベースに接続せずにデータベース呼び出しが発行されたときに発生します。
PROGRAM_ERROR 06501 -6501 PL / SQLに内部問題がある場合に発生します。
ROWTYPE_MISMATCH 06504 -6504 カーソルが互換性のないデータ型を持つ変数の値をフェッチすると発生します。
SELF_IS_NULL 30625 -30625 メンバーメソッドが呼び出されたときに発生しますが、オブジェクトタイプのインスタンスは初期化されていません。
STORAGE_ERROR 06500 -6500 PL / SQLのメモリが不足した場合、またはメモリが破損した場合に発生します。
TOO_MANY_ROWS 01422 -1422 SELECTINTOステートメントが複数の行を返す場合に発生します。
VALUE_ERROR 06502 -6502 これは、算術、変換、切り捨て、またはサイズ制約エラーが発生したときに発生します。
ZERO_DIVIDE 01476 1476 数値をゼロで除算しようとすると発生します。

この章では、PL / SQLのトリガーについて説明します。トリガーはストアドプログラムであり、いくつかのイベントが発生すると自動的に実行または起動されます。実際、トリガーは、次のイベントのいずれかに応答して実行されるように記述されています。

  • A database manipulation (DML) ステートメント(DELETE、INSERT、またはUPDATE)

  • A database definition (DDL) ステートメント(CREATE、ALTER、またはDROP)。

  • A database operation (SERVERERROR、LOGON、LOGOFF、STARTUP、またはSHUTDOWN)。

トリガーは、イベントが関連付けられているテーブル、ビュー、スキーマ、またはデータベースで定義できます。

トリガーの利点

トリガーは次の目的で作成できます-

  • 一部の派生列値を自動的に生成する
  • 参照整合性の実施
  • イベントログとテーブルアクセスに関する情報の保存
  • Auditing
  • テーブルの同期レプリケーション
  • セキュリティ認証を課す
  • 無効なトランザクションの防止

トリガーの作成

トリガーを作成するための構文は次のとおりです。

CREATE [OR REPLACE ] TRIGGER trigger_name  
{BEFORE | AFTER | INSTEAD OF }  
{INSERT [OR] | UPDATE [OR] | DELETE}  
[OF col_name]  
ON table_name  
[REFERENCING OLD AS o NEW AS n]  
[FOR EACH ROW]  
WHEN (condition)   
DECLARE 
   Declaration-statements 
BEGIN  
   Executable-statements 
EXCEPTION 
   Exception-handling-statements 
END;

どこ、

  • CREATE [OR REPLACE] TRIGGERtrigger_name-既存のトリガーを作成するか、trigger_nameで置き換えます。

  • {前| 後| INSTEAD OF}-これは、トリガーがいつ実行されるかを指定します。INSTEAD OF句は、ビューにトリガーを作成するために使用されます。

  • {INSERT [OR] | 更新[または] | DELETE}-これはDML操作を指定します。

  • [OF col_name] −これは更新される列名を指定します。

  • [ON table_name]-これは、トリガーに関連付けられたテーブルの名前を指定します。

  • [古いものを新しいものとして参照する]-これにより、INSERT、UPDATE、DELETEなどのさまざまなDMLステートメントの新しい値と古い値を参照できます。

  • [FOR EACH ROW]-これは、行レベルのトリガーを指定します。つまり、影響を受ける各行に対してトリガーが実行されます。それ以外の場合、トリガーはSQLステートメントの実行時に1回だけ実行されます。これは、テーブルレベルのトリガーと呼ばれます。

  • WHEN(条件)-これは、トリガーが起動する行の条件を提供します。この句は、行レベルのトリガーにのみ有効です。

まず、前の章で作成して使用したCUSTOMERSテーブルを使用します-

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

次のプログラムは、 row-levelCUSTOMERSテーブルで実行されたINSERT、UPDATE、またはDELETE操作に対して起動するcustomersテーブルのトリガー。このトリガーは、古い値と新しい値の給与の差を表示します-

CREATE OR REPLACE TRIGGER display_salary_changes 
BEFORE DELETE OR INSERT OR UPDATE ON customers 
FOR EACH ROW 
WHEN (NEW.ID > 0) 
DECLARE 
   sal_diff number; 
BEGIN 
   sal_diff := :NEW.salary  - :OLD.salary; 
   dbms_output.put_line('Old salary: ' || :OLD.salary); 
   dbms_output.put_line('New salary: ' || :NEW.salary); 
   dbms_output.put_line('Salary difference: ' || sal_diff); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Trigger created.

ここでは、以下の点を考慮する必要があります-

  • OLDおよびNEW参照は、テーブルレベルのトリガーには使用できませんが、レコードレベルのトリガーに使用できます。

  • 同じトリガーでテーブルをクエリする場合は、AFTERキーワードを使用する必要があります。トリガーは、最初の変更が適用され、テーブルが一貫した状態に戻った後でのみ、テーブルをクエリしたり、テーブルを再度変更したりできるためです。

  • 上記のトリガーは、テーブルに対するDELETE、INSERT、またはUPDATE操作の前に起動するように記述されていますが、たとえばBEFORE DELETEのように、単一または複数の操作でトリガーを書き込むことができます。テーブルのDELETE操作を使用して削除されます。

トリガーのトリガー

CUSTOMERSテーブルでいくつかのDML操作を実行してみましょう。これが1つのINSERTステートメントで、テーブルに新しいレコードを作成します-

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (7, 'Kriti', 22, 'HP', 7500.00 );

CUSTOMERSテーブルにレコードが作成されると、上記の作成トリガー、 display_salary_changes が起動され、次の結果が表示されます-

Old salary: 
New salary: 7500 
Salary difference:

これは新しいレコードであるため、古い給与は利用できず、上記の結果はnullになります。ここで、CUSTOMERSテーブルに対してもう1つのDML操作を実行してみましょう。UPDATEステートメントは、テーブル内の既存のレコードを更新します-

UPDATE customers 
SET salary = salary + 500 
WHERE id = 2;

CUSTOMERSテーブルのレコードが更新されると、上記の作成トリガー、 display_salary_changes が起動され、次の結果が表示されます-

Old salary: 1500 
New salary: 2000 
Salary difference: 500

この章では、PL / SQLのパッケージについて説明します。パッケージは、論理的に関連するPL / SQLタイプ、変数、およびサブプログラムをグループ化するスキーマ・オブジェクトです。

パッケージには2つの必須部分があります-

  • パッケージ仕様
  • パッケージ本体または定義

パッケージ仕様

仕様はパッケージへのインターフェースです。それだけDECLARESパッケージの外部から参照できるタイプ、変数、定数、例外、カーソル、およびサブプログラム。つまり、パッケージの内容に関するすべての情報が含まれていますが、サブプログラムのコードは除外されています。

仕様に配置されたすべてのオブジェクトは呼び出されます publicオブジェクト。パッケージ仕様に含まれていないがパッケージ本体にコーディングされているサブプログラムは、private オブジェクト。

次のコードスニペットは、単一のプロシージャを持つパッケージ仕様を示しています。パッケージ内に多くのグローバル変数を定義し、複数のプロシージャまたは関数を含めることができます。

CREATE PACKAGE cust_sal AS 
   PROCEDURE find_sal(c_id customers.id%type); 
END cust_sal; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Package created.

パッケージ本体

パッケージ本体には、パッケージ仕様で宣言されているさまざまなメソッドのコードやその他のプライベート宣言があり、パッケージ外のコードからは隠されています。

ザ・ CREATE PACKAGE BODYステートメントは、パッケージ本体の作成に使用されます。次のコードスニペットは、のパッケージ本体宣言を示しています。cust_sal上で作成したパッケージ。PL / SQL-変数の章で説明したように、データベースにはすでにCUSTOMERSテーブルが作成されていると想定しました。

CREATE OR REPLACE PACKAGE BODY cust_sal AS  
   
   PROCEDURE find_sal(c_id customers.id%TYPE) IS 
   c_sal customers.salary%TYPE; 
   BEGIN 
      SELECT salary INTO c_sal 
      FROM customers 
      WHERE id = c_id; 
      dbms_output.put_line('Salary: '|| c_sal); 
   END find_sal; 
END cust_sal; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Package body created.

パッケージ要素の使用

パッケージ要素(変数、プロシージャ、または関数)には、次の構文でアクセスします。

package_name.element_name;

データベーススキーマに上記のパッケージをすでに作成していることを考慮してください。次のプログラムは find_sal の方法 cust_sal パッケージ-

DECLARE 
   code customers.id%type := &cc_id; 
BEGIN 
   cust_sal.find_sal(code); 
END; 
/

上記のコードをSQLプロンプトで実行すると、顧客IDの入力を求められ、IDを入力すると、対応する給与が次のように表示されます。

Enter value for cc_id: 1 
Salary: 3000 

PL/SQL procedure successfully completed.

次のプログラムは、より完全なパッケージを提供します。データベースに保存されているCUSTOMERSテーブルを次のレコードとともに使用します-

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  3000.00 | 
|  2 | Khilan   |  25 | Delhi     |  3000.00 | 
|  3 | kaushik  |  23 | Kota      |  3000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  7500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  9500.00 | 
|  6 | Komal    |  22 | MP        |  5500.00 | 
+----+----------+-----+-----------+----------+

パッケージ仕様

CREATE OR REPLACE PACKAGE c_package AS 
   -- Adds a customer 
   PROCEDURE addCustomer(c_id   customers.id%type, 
   c_name  customerS.No.ame%type, 
   c_age  customers.age%type, 
   c_addr customers.address%type,  
   c_sal  customers.salary%type); 
   
   -- Removes a customer 
   PROCEDURE delCustomer(c_id  customers.id%TYPE); 
   --Lists all customers 
   PROCEDURE listCustomer; 
  
END c_package; 
/

上記のコードをSQLプロンプトで実行すると、上記のパッケージが作成され、次の結果が表示されます。

Package created.

パッケージ本体の作成

CREATE OR REPLACE PACKAGE BODY c_package AS 
   PROCEDURE addCustomer(c_id  customers.id%type, 
      c_name customerS.No.ame%type, 
      c_age  customers.age%type, 
      c_addr  customers.address%type,  
      c_sal   customers.salary%type) 
   IS 
   BEGIN 
      INSERT INTO customers (id,name,age,address,salary) 
         VALUES(c_id, c_name, c_age, c_addr, c_sal); 
   END addCustomer; 
   
   PROCEDURE delCustomer(c_id   customers.id%type) IS 
   BEGIN 
      DELETE FROM customers 
      WHERE id = c_id; 
   END delCustomer;  
   
   PROCEDURE listCustomer IS 
   CURSOR c_customers is 
      SELECT  name FROM customers; 
   TYPE c_list is TABLE OF customers.Name%type;  
   name_list c_list := c_list(); 
   counter integer :=0; 
   BEGIN 
      FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list.extend; 
      name_list(counter) := n.name; 
      dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter)); 
      END LOOP; 
   END listCustomer;
   
END c_package; 
/

上記の例では、 nested table。次の章では、ネストされたテーブルの概念について説明します。

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Package body created.

パッケージの使用

次のプログラムは、パッケージc_packageで宣言および定義されたメソッドを使用します。

DECLARE 
   code customers.id%type:= 8; 
BEGIN 
   c_package.addcustomer(7, 'Rajnish', 25, 'Chennai', 3500); 
   c_package.addcustomer(8, 'Subham', 32, 'Delhi', 7500); 
   c_package.listcustomer; 
   c_package.delcustomer(code); 
   c_package.listcustomer; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal 
Customer(7): Rajnish 
Customer(8): Subham 
Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal
Customer(7): Rajnish 

PL/SQL procedure successfully completed

この章では、PL / SQLのコレクションについて説明します。コレクションは、同じデータ型を持つ要素の順序付けられたグループです。各要素は、コレクション内での位置を表す一意の添え字で識別されます。

PL / SQLは3つのコレクションタイプを提供します-

  • インデックスバイテーブルまたは連想配列
  • ネストされたテーブル
  • 可変サイズ配列またはVarray

Oracleのドキュメントには、コレクションのタイプごとに次の特性が記載されています。

コレクションタイプ 要素の数 添え字タイプ 密または疎 作成場所 オブジェクトタイプ属性にすることができます
連想配列(またはインデックスバイテーブル) 無制限 文字列または整数 どちらか PL / SQLブロックのみ 番号
ネストされたテーブル 無制限 整数 密集して始まり、疎になる可能性があります PL / SQLブロックまたはスキーマレベルのいずれか はい
可変サイズ配列(Varray) 跳ねる 整数 常に密集 PL / SQLブロックまたはスキーマレベルのいずれか はい

この章ではすでにvarrayについて説明しました 'PL/SQL arrays'。この章では、PL / SQL表について説明します。

両方のタイプのPL / SQL表、つまり、索引付け表とネストされた表は同じ構造を持ち、それらの行は添え字表記を使用してアクセスされます。ただし、これら2つのタイプのテーブルは1つの側面で異なります。ネストされたテーブルはデータベース列に格納できますが、index-byテーブルは格納できません。

インデックス-テーブル別

アン index-by テーブル(別名 associative array)はのセットです key-valueペア。各キーは一意であり、対応する値を見つけるために使用されます。キーは整数または文字列のいずれかです。

インデックスバイテーブルは、次の構文を使用して作成されます。ここでは、index-by 名前の付いたテーブル table_name、そのキーはsubscript_typeになり、関連する値はelement_typeになります

TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type; 
 
table_name type_name;

次の例は、名前とともに整数値を格納するテーブルを作成し、後で同じ名前のリストを出力する方法を示しています。

DECLARE 
   TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20); 
   salary_list salary; 
   name   VARCHAR2(20); 
BEGIN 
   -- adding elements to the table 
   salary_list('Rajnish') := 62000; 
   salary_list('Minakshi') := 75000; 
   salary_list('Martin') := 100000; 
   salary_list('James') := 78000;  
   
   -- printing the table 
   name := salary_list.FIRST; 
   WHILE name IS NOT null LOOP 
      dbms_output.put_line 
      ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name))); 
      name := salary_list.NEXT(name); 
   END LOOP; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Salary of James is 78000 
Salary of Martin is 100000 
Salary of Minakshi is 75000 
Salary of Rajnish is 62000  

PL/SQL procedure successfully completed.

index-byテーブルの要素は、 %ROWTYPE 任意のデータベーステーブルまたは %TYPE任意のデータベーステーブルフィールドの。次の例は、概念を示しています。を使用しますCUSTOMERS データベースに-として格納されているテーブル

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

DECLARE 
   CURSOR c_customers is 
      select name from customers; 

   TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer; 
   name_list c_list; 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list(counter) := n.name; 
      dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter)); 
   END LOOP; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed

ネストされたテーブル

A nested table任意の数の要素を持つ1次元配列のようなものです。ただし、ネストされたテーブルは、次の点で配列とは異なります。

  • 配列には宣言された数の要素がありますが、ネストされたテーブルにはありません。ネストされたテーブルのサイズは動的に増加する可能性があります。

  • 配列は常に密です。つまり、常に連続した添え字があります。ネストされた配列は最初は密ですが、要素が削除されると疎になる可能性があります。

ネストされたテーブルは、次の構文を使用して作成されます-

TYPE type_name IS TABLE OF element_type [NOT NULL]; 
 
table_name type_name;

この宣言は、 index-by テーブルがありません INDEX BY 句。

ネストされたテーブルは、データベースの列に格納できます。さらに、単一列のテーブルをより大きなテーブルと結合するSQL操作を簡素化するために使用できます。連想配列をデータベースに保存することはできません。

次の例は、ネストされたテーブルの使用法を示しています。

DECLARE 
   TYPE names_table IS TABLE OF VARCHAR2(10); 
   TYPE grades IS TABLE OF INTEGER;  
   names names_table; 
   marks grades; 
   total integer; 
BEGIN 
   names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); 
   marks:= grades(98, 97, 78, 87, 92); 
   total := names.count; 
   dbms_output.put_line('Total '|| total || ' Students'); 
   FOR i IN 1 .. total LOOP 
      dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i)); 
   end loop; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Total 5 Students 
Student:Kavita, Marks:98 
Student:Pritam, Marks:97 
Student:Ayan, Marks:78 
Student:Rishav, Marks:87 
Student:Aziz, Marks:92  

PL/SQL procedure successfully completed.

の要素 nested table することもできます %ROWTYPE任意のデータベーステーブルの、または任意のデータベーステーブルフィールドの%TYPE。次の例は、概念を示しています。データベースに格納されているCUSTOMERSテーブルを-として使用します。

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+

DECLARE 
   CURSOR c_customers is  
      SELECT  name FROM customers;  
   TYPE c_list IS TABLE of customerS.No.ame%type; 
   name_list c_list := c_list(); 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list.extend; 
      name_list(counter)  := n.name; 
      dbms_output.put_line('Customer('||counter||'):'||name_list(counter)); 
   END LOOP; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed.

収集方法

PL / SQLには、コレクションを使いやすくする組み込みのコレクション・メソッドが用意されています。次の表に、メソッドとその目的を示します。

S.No メソッド名と目的
1

EXISTS(n)

コレクション内のn番目の要素が存在する場合はTRUEを返します。それ以外の場合はFALSEを返します。

2

COUNT

コレクションに現在含まれている要素の数を返します。

3

LIMIT

コレクションの最大サイズを確認します。

4

FIRST

整数の添え字を使用するコレクションの最初の(最小の)インデックス番号を返します。

5

LAST

整数の添え字を使用するコレクションの最後の(最大の)インデックス番号を返します。

6

PRIOR(n)

コレクション内のインデックスnの前にあるインデックス番号を返します。

7

NEXT(n)

インデックスnに続くインデックス番号を返します。

8

EXTEND

1つのnull要素をコレクションに追加します。

9

EXTEND(n)

n個のnull要素をコレクションに追加します。

10

EXTEND(n,i)

追加します ni番目の要素のコレクションへのコピー。

11

TRIM

コレクションの最後から1つの要素を削除します。

12

TRIM(n)

削除します n コレクションの最後からの要素。

13

DELETE

コレクションからすべての要素を削除し、COUNTを0に設定します。

14

DELETE(n)

を削除します nth数値キーまたはネストされたテーブルを持つ連想配列の要素。連想配列に文字列キーがある場合、キー値に対応する要素が削除されます。場合n 無効である、 DELETE(n) 何もしません。

15

DELETE(m,n)

範囲内のすべての要素を削除します m..n連想配列またはネストされたテーブルから。場合m より大きい n または m または n 無効である、 DELETE(m,n) 何もしません。

コレクションの例外

次の表に、コレクションの例外とそれらが発生した場合を示します。

コレクションの例外 状況で発生
COLLECTION_IS_NULL アトミックにnullのコレクションを操作しようとしました。
何もデータが見つかりませんでした 下付き文字は、削除された要素、または連想配列の存在しない要素を示します。
SUBSCRIPT_BEYOND_COUNT 添え字がコレクション内の要素の数を超えています。
SUBSCRIPT_OUTSIDE_LIMIT 添え字が許容範囲外です。
VALUE_ERROR 下付き文字がnullであるか、キータイプに変換できません。この例外は、キーが次のように定義されている場合に発生する可能性があります。PLS_INTEGER 範囲であり、添え字はこの範囲外です。

この章では、PL / SQLでのトランザクションについて説明します。データベースtransaction1つ以上の関連するSQLステートメントで構成される可能性のあるアトミックな作業単位です。トランザクションを構成するSQLステートメントによってもたらされるデータベースの変更は、まとめてコミットできる、つまりデータベースに永続的にするか、データベースからロールバック(元に戻す)できるため、アトミックと呼ばれます。

正常に実行されたSQLステートメントとコミットされたトランザクションは同じではありません。SQLステートメントが正常に実行された場合でも、ステートメントを含むトランザクションがコミットされない限り、SQLステートメントをロールバックして、ステートメントによって行われたすべての変更を元に戻すことができます。

トランザクションの開始と終了

トランザクションには beginningend。次のいずれかのイベントが発生すると、トランザクションが開始されます-

  • 最初のSQLステートメントは、データベースに接続した後に実行されます。

  • トランザクションの完了後に発行された新しいSQLステートメントごと。

次のいずれかのイベントが発生すると、トランザクションは終了します-

  • A COMMIT または ROLLBACK ステートメントが発行されます。

  • A DDL などのステートメント CREATE TABLEステートメントは、発行されます。その場合、COMMITが自動的に実行されるためです。

  • A DCL などのステートメント GRANTステートメントは、発行されます。その場合、COMMITが自動的に実行されるためです。

  • ユーザーがデータベースから切断します。

  • ユーザーはから終了します SQL*PLUS 発行することにより EXIT コマンドを実行すると、COMMITが自動的に実行されます。

  • SQL * Plusが異常終了します。 ROLLBACK 自動的に実行されます。

  • A DMLステートメントは失敗します。その場合、そのDMLステートメントを元に戻すためにROLLBACKが自動的に実行されます。

トランザクションのコミット

SQLコマンドCOMMITを発行すると、トランザクションが永続的になります。COMMITコマンドの一般的な構文は次のとおりです。

COMMIT;

例えば、

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (6, 'Komal', 22, 'MP', 4500.00 ); 

COMMIT;

トランザクションのロールバック

COMMITを使用せずにデータベースに加えられた変更は、ROLLBACKコマンドを使用して元に戻すことができます。

ROLLBACKコマンドの一般的な構文は次のとおりです。

ROLLBACK [TO SAVEPOINT < savepoint_name>];

システム障害などの前例のない状況が原因でトランザクションが中止された場合、コミット以降のトランザクション全体が自動的にロールバックされます。使用していない場合savepoint、次に、次のステートメントを使用して、すべての変更をロールバックします-

ROLLBACK;

セーブポイント

セーブポイントは、いくつかのチェックポイントを設定することにより、長いトランザクションをより小さな単位に分割するのに役立つ一種のマーカーです。長いトランザクション内でセーブポイントを設定することにより、必要に応じてチェックポイントにロールバックできます。これは、を発行することによって行われますSAVEPOINT コマンド。

SAVEPOINTコマンドの一般的な構文は次のとおりです。

SAVEPOINT < savepoint_name >;

例えば

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 ); 
SAVEPOINT sav1;
  
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000; 
ROLLBACK TO sav1;
  
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000 
WHERE ID = 7; 
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000 
WHERE ID = 8; 

COMMIT;

ROLLBACK TO sav1 −このステートメントは、セーブポイントsav1をマークしたポイントまでのすべての変更をロールバックします。

その後、行った新しい変更が開始されます。

自動トランザクション制御

実行するには COMMIT いつでも自動的に INSERT, UPDATE または DELETE コマンドを実行すると、 AUTOCOMMIT −としての環境変数

SET AUTOCOMMIT ON;

次のコマンドを使用して、自動コミットモードをオフにすることができます-

SET AUTOCOMMIT OFF;

この章では、PL / SQLの日付と時刻について説明します。PL / SQLには、日付と時刻に関連するデータ型の2つのクラスがあります。

  • 日時データ型
  • 間隔データ型

日時のデータ型は次のとおりです。

  • DATE
  • TIMESTAMP
  • タイムゾーン付きのタイムスタンプ
  • ローカルタイムゾーンのタイムスタンプ

間隔のデータ型は次のとおりです。

  • 年から月までの間隔
  • 2番目の間隔日

日時および間隔データ型のフィールド値

どちらも datetime そして interval データ型は fields。これらのフィールドの値は、データ型の値を決定します。次の表に、フィールドと、日時および間隔の可能な値を示します。

フィールド名 有効な日時値 有効な間隔値
-4712から9999(0年を除く) ゼロ以外の整数
01から12 0から11
01から31(ロケールのカレンダーの規則に従って、MONTHとYEARの値によって制限されます) ゼロ以外の整数
時間 00から23 0から23
00から59 0から59
2番目

00〜59.9(n)、ここで9(n)は時間の小数秒の精度です

9(n)の部分はDATEには適用されません。

0〜59.9(n)、ここで9(n)は間隔の小数秒の精度です
TIMEZONE_HOUR

-12〜14(範囲は夏時間の変更に対応)

DATEまたはTIMESTAMPには適用されません。

適用できません
TIMEZONE_MINUTE

00から59

DATEまたはTIMESTAMPには適用されません。

適用できません
TIMEZONE_REGION DATEまたはTIMESTAMPには適用されません。 適用できません
TIMEZONE_ABBR DATEまたはTIMESTAMPには適用されません。 適用できません

日時のデータ型と関数

日時のデータ型は次のとおりです-

日付

文字と数値の両方のデータ型で日付と時刻の情報を格納します。世紀、年、月、日付、時、分、秒の情報で構成されています。−として指定されます

タイムスタンプ

これは、DATEデータ型の拡張です。DATEデータ型の年、月、日を、時、分、秒の値とともに格納します。正確な時間値を保存するのに役立ちます。

タイムゾーン付きのタイムスタンプ

これは、タイムゾーン領域名またはタイムゾーンオフセットを値に含むTIMESTAMPのバリアントです。タイムゾーンオフセットは、現地時間とUTCの差(時間と分)です。このデータ型は、地理的地域全体の日付情報を収集および評価するのに役立ちます。

ローカルタイムゾーンのタイムスタンプ

これは、値にタイムゾーンオフセットを含むTIMESTAMPの別のバリアントです。

次の表に、日時関数を示します(ここで、xは日時値です)-

S.No 関数名と説明
1

ADD_MONTHS(x, y);

追加します y に数ヶ月 x

2

LAST_DAY(x);

月の最後の日を返します。

3

MONTHS_BETWEEN(x, y);

間の月数を返します x そして y

4

NEXT_DAY(x, day);

次の日時を返し後にx

5

NEW_TIME;

ユーザーが指定したタイムゾーンから時間/日の値を返します。

6

ROUND(x [, unit]);

ラウンド x

7

SYSDATE();

現在の日時を返します。

8

TRUNC(x [, unit]);

切り捨てる x

タイムスタンプ関数(ここで、xはタイムスタンプ値を持ちます)-

S.No 関数名と説明
1

CURRENT_TIMESTAMP();

現在のセッション時間をセッションタイムゾーンとともに含むTIMESTAMPWITH TIMEZONEを返します。

2

EXTRACT({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND } | { TIMEZONE_HOUR | TIMEZONE_MINUTE } | { TIMEZONE_REGION | } TIMEZONE_ABBR ) FROM x)

年、月、日、時、分、秒、またはタイムゾーンを抽出して返します。 x

3

FROM_TZ(x, time_zone);

TIMESTAMPxとtime_zoneで指定されたタイムゾーンをTIMESTAMPWITHTIMEZONEに変換します。

4

LOCALTIMESTAMP();

セッションタイムゾーンの現地時間を含むTIMESTAMPを返します。

5

SYSTIMESTAMP();

現在のデータベース時刻とデータベースタイムゾーンを含むTIMESTAMPWITH TIMEZONEを返します。

6

SYS_EXTRACT_UTC(x);

TIMESTAMP WITH TIMEZONE xを、UTCでの日付と時刻を含むTIMESTAMPに変換します。

7

TO_TIMESTAMP(x, [format]);

文字列xをTIMESTAMPに変換します。

8

TO_TIMESTAMP_TZ(x, [format]);

文字列xをTIMESTAMPWITHTIMEZONEに変換します。

次のコードスニペットは、上記の関数の使用法を示しています-

Example 1

SELECT SYSDATE FROM DUAL;

Output

08/31/2012 5:25:34 PM

Example 2

SELECT TO_CHAR(CURRENT_DATE, 'DD-MM-YYYY HH:MI:SS') FROM DUAL;

Output

31-08-2012 05:26:14

Example 3

SELECT ADD_MONTHS(SYSDATE, 5) FROM DUAL;

Output

01/31/2013 5:26:31 PM

Example 4

SELECT LOCALTIMESTAMP FROM DUAL;

Output

8/31/2012 5:26:55.347000 PM

区間データ型と関数

間隔のデータ型は次のとおりです-

  • IINTERVAL YEAR TOMONTH-YEARおよびMONTH日時フィールドを使用して期間を格納します。

  • INTERVAL DAY TO SECOND-日、時間、分、秒で期間を保存します。

区間関数

S.No 関数名と説明
1

NUMTODSINTERVAL(x, interval_unit);

数値xをINTERVALDAY TOSECONDに変換します。

2

NUMTOYMINTERVAL(x, interval_unit);

数値xをINTERVALYEAR TOMONTHに変換します。

3

TO_DSINTERVAL(x);

文字列xをINTERVALDAY TOSECONDに変換します。

4

TO_YMINTERVAL(x);

文字列xをINTERVALYEAR TOMONTHに変換します。

この章では、PL / SQLでのDBMS出力について説明します。ザ・DBMS_OUTPUTは、出力、デバッグ情報を表示し、PL / SQLブロック、サブプログラム、パッケージ、およびトリガーからメッセージを送信できるようにする組み込みパッケージです。チュートリアル全体でこのパッケージをすでに使用しています。

データベース内のすべてのユーザーテーブルを表示する小さなコードスニペットを見てみましょう。データベースで試して、すべてのテーブル名を一覧表示してください-

BEGIN 
   dbms_output.put_line  (user || ' Tables in the database:'); 
   FOR t IN (SELECT table_name FROM user_tables) 
   LOOP 
      dbms_output.put_line(t.table_name); 
   END LOOP; 
END; 
/

DBMS_OUTPUTサブプログラム

DBMS_OUTPUTパッケージには、次のサブプログラムがあります-

S.No サブプログラムと目的
1

DBMS_OUTPUT.DISABLE;

メッセージ出力を無効にします。

2

DBMS_OUTPUT.ENABLE(buffer_size IN INTEGER DEFAULT 20000);

メッセージ出力を有効にします。のNULL値buffer_size 無制限のバッファサイズを表します。

3

DBMS_OUTPUT.GET_LINE (line OUT VARCHAR2, status OUT INTEGER);

バッファリングされた情報の1行を取得します。

4

DBMS_OUTPUT.GET_LINES (lines OUT CHARARR, numlines IN OUT INTEGER);

バッファから行の配列を取得します。

5

DBMS_OUTPUT.NEW_LINE;

行末マーカーを配置します。

6

DBMS_OUTPUT.PUT(item IN VARCHAR2);

バッファに部分的な行を配置します。

7

DBMS_OUTPUT.PUT_LINE(item IN VARCHAR2);

バッファに行を配置します。

DECLARE 
   lines dbms_output.chararr; 
   num_lines number; 
BEGIN 
   -- enable the buffer with default size 20000 
   dbms_output.enable; 
   
   dbms_output.put_line('Hello Reader!'); 
   dbms_output.put_line('Hope you have enjoyed the tutorials!'); 
   dbms_output.put_line('Have a great time exploring pl/sql!'); 
  
   num_lines := 3; 
  
   dbms_output.get_lines(lines, num_lines); 
  
   FOR i IN 1..num_lines LOOP 
      dbms_output.put_line(lines(i)); 
   END LOOP; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Hello Reader! 
Hope you have enjoyed the tutorials! 
Have a great time exploring pl/sql!  

PL/SQL procedure successfully completed.

この章では、オブジェクト指向PL / SQLについて説明します。PL / SQLを使用すると、オブジェクトタイプを定義できます。これは、Oracleでのオブジェクト指向データベースの設計に役立ちます。オブジェクトタイプを使用すると、複合タイプを作成できます。オブジェクトを使用すると、データの特定の構造とそれを操作するためのメソッドを使用して、実世界のオブジェクトを実装できます。オブジェクトには属性とメソッドがあります。属性はオブジェクトのプロパティであり、オブジェクトの状態を格納するために使用されます。とメソッドは、その動作をモデル化するために使用されます。

オブジェクトは、CREATE [OR REPLACE] TYPEステートメントを使用して作成されます。以下は、簡単なものを作成する例です。address いくつかの属性で構成されるオブジェクト-

CREATE OR REPLACE TYPE address AS OBJECT 
(house_no varchar2(10), 
 street varchar2(30), 
 city varchar2(20), 
 state varchar2(10), 
 pincode varchar2(10) 
); 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

もう1つのオブジェクトを作成しましょう customer ラップする場所 attributes そして methods 一緒にオブジェクト指向の感覚を持つ-

CREATE OR REPLACE TYPE customer AS OBJECT 
(code number(5), 
 name varchar2(30), 
 contact_no varchar2(12), 
 addr address, 
 member procedure display 
); 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

オブジェクトのインスタンス化

オブジェクトタイプを定義すると、オブジェクトの青写真が提供されます。このオブジェクトを使用するには、このオブジェクトのインスタンスを作成する必要があります。インスタンス名を使用してオブジェクトの属性とメソッドにアクセスでき、the access operator (.) 次のように-

DECLARE 
   residence address; 
BEGIN 
   residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301'); 
   dbms_output.put_line('House No: '|| residence.house_no); 
   dbms_output.put_line('Street: '|| residence.street); 
   dbms_output.put_line('City: '|| residence.city); 
   dbms_output.put_line('State: '|| residence.state); 
   dbms_output.put_line('Pincode: '|| residence.pincode); 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

House No: 103A 
Street: M.G.Road 
City: Jaipur 
State: Rajasthan 
Pincode: 201301  

PL/SQL procedure successfully completed.

メンバーメソッド

Member methods を操作するために使用されます attributesオブジェクトの。オブジェクトタイプを宣言するときに、メンバーメソッドの宣言を提供します。オブジェクト本体は、メンバーメソッドのコードを定義します。オブジェクト本体は、CREATE TYPEBODYステートメントを使用して作成されます。

Constructors値として新しいオブジェクトを返す関数です。すべてのオブジェクトには、システム定義のコンストラクターメソッドがあります。コンストラクターの名前は、オブジェクトタイプと同じです。例-

residence := address('103A', 'M.G.Road', 'Jaipur', 'Rajasthan','201301');

ザ・ comparison methodsオブジェクトを比較するために使用されます。オブジェクトを比較する方法は2つあります-

マップ方法

ザ・ Map methodは、その値が属性の値に依存するように実装された関数です。たとえば、顧客オブジェクトの場合、顧客コードが2人の顧客で同じである場合、両方の顧客が同じである可能性があります。したがって、これら2つのオブジェクト間の関係は、コードの値に依存します。

注文方法

ザ・ Order method2つのオブジェクトを比較するための内部ロジックを実装します。たとえば、長方形オブジェクトの場合、長方形の両側が大きいと、長方形は別の長方形よりも大きくなります。

Mapメソッドを使用する

次の長方形オブジェクトを使用して、上記の概念を理解してみましょう-

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member function enlarge( inc number) return rectangle, 
 member procedure display, 
 map member function measure return number 
); 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

タイプ本体の作成-

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER FUNCTION enlarge(inc number) return rectangle IS 
   BEGIN 
      return rectangle(self.length + inc, self.width + inc); 
   END enlarge;  
   MEMBER PROCEDURE display IS 
   BEGIN  
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   MAP MEMBER FUNCTION measure return number IS 
   BEGIN 
      return (sqrt(length*length + width*width)); 
   END measure; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type body created.

長方形オブジェクトとそのメンバー関数を使用するようになりました-

DECLARE 
   r1 rectangle; 
   r2 rectangle; 
   r3 rectangle; 
   inc_factor number := 5; 
BEGIN 
   r1 := rectangle(3, 4); 
   r2 := rectangle(5, 7); 
   r3 := r1.enlarge(inc_factor); 
   r3.display;  
   IF (r1 > r2) THEN -- calling measure function 
      r1.display; 
   ELSE 
      r2.display; 
   END IF; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Length: 8 
Width: 9 
Length: 5 
Width: 7  

PL/SQL procedure successfully completed.

Orderメソッドを使用する

さて、 same effect could be achieved using an order method。orderメソッドを使用して長方形オブジェクトを再作成しましょう-

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member procedure display, 
 order member function measure(r rectangle) return number 
); 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

タイプ本体の作成-

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display;  
   ORDER MEMBER FUNCTION measure(r rectangle) return number IS 
   BEGIN 
      IF(sqrt(self.length*self.length + self.width*self.width)> 
         sqrt(r.length*r.length + r.width*r.width)) then 
         return(1); 
      ELSE 
         return(-1); 
      END IF; 
   END measure; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type body created.

長方形オブジェクトとそのメンバー関数の使用-

DECLARE 
   r1 rectangle; 
   r2 rectangle; 
BEGIN 
   r1 := rectangle(23, 44); 
   r2 := rectangle(15, 17); 
   r1.display; 
   r2.display; 
   IF (r1 > r2) THEN -- calling measure function 
      r1.display; 
   ELSE 
      r2.display; 
   END IF; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Length: 23 
Width: 44 
Length: 15 
Width: 17 
Length: 23 
Width: 44 

PL/SQL procedure successfully completed.

PL / SQLオブジェクトの継承

PL / SQLでは、既存の基本オブジェクトからオブジェクトを作成できます。継承を実装するには、基本オブジェクトを次のように宣言する必要があります。NOT FINAL。デフォルトはFINAL

次のプログラムは、PL / SQLオブジェクトの継承を示しています。名前の付いた別のオブジェクトを作成しましょうTableTop、これはRectangleオブジェクトから継承されます。このために、ベース長方形オブジェクトを作成する必要があります-

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 member function enlarge( inc number) return rectangle, 
 NOT FINAL member procedure display) NOT FINAL 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

ベースタイプのボディを作成する-

CREATE OR REPLACE TYPE BODY rectangle AS 
   MEMBER FUNCTION enlarge(inc number) return rectangle IS 
   BEGIN 
      return rectangle(self.length + inc, self.width + inc); 
   END enlarge;  
   MEMBER PROCEDURE display IS 
   BEGIN 
      dbms_output.put_line('Length: '|| length); 
      dbms_output.put_line('Width: '|| width); 
   END display; 
END; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type body created.

子オブジェクトテーブルトップの作成-

CREATE OR REPLACE TYPE tabletop UNDER rectangle 
(   
   material varchar2(20), 
   OVERRIDING member procedure display 
) 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.

子オブジェクトテーブルトップの型本体の作成

CREATE OR REPLACE TYPE BODY tabletop AS 
OVERRIDING MEMBER PROCEDURE display IS 
BEGIN 
   dbms_output.put_line('Length: '|| length); 
   dbms_output.put_line('Width: '|| width); 
   dbms_output.put_line('Material: '|| material); 
END display; 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type body created.

使用する卓上型オブジェクトとそのメンバ関数を-

DECLARE 
   t1 tabletop; 
   t2 tabletop; 
BEGIN 
   t1:= tabletop(20, 10, 'Wood'); 
   t2 := tabletop(50, 30, 'Steel'); 
   t1.display; 
   t2.display; 
END;
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Length: 20 
Width: 10 
Material: Wood 
Length: 50 
Width: 30 
Material: Steel  

PL/SQL procedure successfully completed.

PL / SQLの抽象オブジェクト

ザ・ NOT INSTANTIABLE句を使用すると、抽象オブジェクトを宣言できます。抽象オブジェクトをそのまま使用することはできません。その機能を使用するには、そのようなオブジェクトのサブタイプまたは子タイプを作成する必要があります。

例えば、

CREATE OR REPLACE TYPE rectangle AS OBJECT 
(length number, 
 width number, 
 NOT INSTANTIABLE NOT FINAL MEMBER PROCEDURE display)  
 NOT INSTANTIABLE NOT FINAL 
/

上記のコードをSQLプロンプトで実行すると、次の結果が生成されます。

Type created.