PL/SQL ( Procedural Language for SQL ) は、Oracle CorporationによるSQLおよびOracle リレーショナル データベースの手続き型 拡張機能です。PL/SQL は、Oracle Database (バージョン 6 以降、ストアド PL/SQL プロシージャ/関数/パッケージ/トリガーはバージョン 7 以降)、TimesTen インメモリ データベース(バージョン 11.2.1 以降)、およびIBM Db2 (バージョン 9.7 以降) で使用できます。[1] Oracle Corporation は通常、Oracle Database のリリースごとに PL/SQL 機能を拡張しています。
PL/SQL には、条件やループなどの手続き型言語要素が含まれており、例外(実行時エラー) を処理できます。定数と変数、プロシージャ、関数、パッケージ、タイプとそれらのタイプの変数、およびトリガーを宣言できます。PL /SQL コレクションの使用を伴う配列がサポートされています。Oracle Database バージョン 8 以降の実装には、オブジェクト指向に関連する機能が含まれています。プロシージャ、関数、パッケージ、タイプ、トリガーなどの PL/SQL ユニットを作成できます。これらはデータベースに格納され、Oracle Database のプログラム インタフェースを使用するアプリケーションで再利用できます。
PL/SQL定義の最初の公開バージョン[2]は1995年に公開されました。これはISO SQL/PSM標準を実装しています。[3]
PL/SQL プログラムユニット
SQL(非手続き型)の主な特徴は、欠点でもあります。SQLのみを使用する場合、制御文(意思決定または反復制御)は使用できません。PL/SQLは、意思決定、反復など、他の手続き型プログラミング言語の機能を提供します。PL/SQLプログラムユニットは、PL/SQL匿名ブロック、プロシージャ、関数、パッケージ仕様、パッケージ本体、トリガー、型仕様、型本体、ライブラリのいずれかです。プログラムユニットは、データベース上で開発、コンパイルされ、最終的に実行されるPL/SQLソースコードです。[4]
PL/SQL匿名ブロック
PL/SQL ソース プログラムの基本単位はブロックで、関連する宣言と文をグループ化します。PL/SQL ブロックはキーワード DECLARE、BEGIN、EXCEPTION、END によって定義されます。これらのキーワードはブロックを宣言部分、実行部分、例外処理部分に分割します。宣言セクションはオプションであり、定数と変数の定義と初期化に使用できます。変数が初期化されていない場合は、デフォルトでNULL値になります。オプションの例外処理部分は、実行時エラーを処理するために使用されます。実行部分のみが必須です。ブロックにはラベルを付けることができます。[5]
例えば:
<<label>> -- これはオプションですDECLARE -- このセクションはオプションですnumber1 NUMBER ( 2 ); number2 number1 %TYPE := 17 ; -- 値のデフォルトtext1 VARCHAR2 ( 12 ) := ' Hello world ' ; text2 DATE := SYSDATE ; -- 現在の日付と時刻BEGIN -- このセクションは必須です。少なくとも 1 つの実行可能ステートメントを含める必要がありますSELECT street_number INTO number1 FROM address WHERE name = 'INU' ; EXCEPTION -- このセクションはオプションですWHEN OTHERS THEN DBMS_OUTPUT . PUT_LINE ( 'エラー コードは ' || TO_CHAR ( sqlcode )); DBMS_OUTPUT . PUT_LINE ( 'エラー メッセージは ' || sqlerrm ); END ;
このシンボルは、変数に値を格納する
代入演算子:=として機能します。
ブロックはネストできます。つまり、ブロックは実行文であるため、実行文が許可されている場所であれば、別のブロック内に出現できます。ブロックは、対話型ツール (SQL*Plus など) に送信したり、Oracle プリコンパイラまたはOCIプログラム内に埋め込んだりできます。対話型ツールまたはプログラムは、ブロックを 1 回実行します。ブロックはデータベースに保存されないため、ラベルが付いている場合でも匿名ブロックと呼ばれます。
関数
PL/SQL関数の目的は、一般的に単一の値を計算して返すことです。返される値は、単一のスカラー値(数値、日付、文字列など)または単一のコレクション(ネストされた表や配列など)です。 ユーザー定義関数は、 Oracle Corporationが提供する組み込み関数を補完します。[6]
PL/SQL 関数の形式は次のとおりです。
CREATE OR REPLACE FUNCTION < function_name > [(入力/出力変数宣言)] RETURN return_type [ AUTHID < CURRENT_USER | DEFINER > ] < IS | AS > -- 見出し部分金額番号; -- 宣言ブロックBEGIN -- 実行可能部分< return文を含むPL / SQLブロック> RETURN < return_value > ; [例外なし] RETURN < return_value > ; END ;
パイプラインテーブル関数はコレクション[7]を返し 、次のような形式になります。
CREATE OR REPLACE FUNCTION < function_name > [(入力/出力変数宣言)] RETURN return_type [ AUTHID < CURRENT_USER | DEFINER > ] [ < AGGREGATE | PIPELINED > ] < IS | USING > [宣言ブロック] BEGIN < return文を含むPL / SQLブロック> PIPE ROW <戻り値の型> ; RETURN ; [例外例外ブロック] PIPE ROW <戻り値の型> ; RETURN ; END ;
関数では、デフォルトの IN タイプのパラメータのみを使用する必要があります。関数からの出力値は、関数が返す値のみである必要があります。
手順
プロシージャは、繰り返し呼び出すことができる名前付きプログラム単位であるという点で関数に似ています。主な違いは、関数はSQL文で使用できるのに対し、プロシージャは使用できないことです。もう1つの違いは、プロシージャは複数の値を返すことができるのに対し、関数は1つの値しか返さないことです。[8]
プロシージャは、プロシージャ名とオプションのプロシージャ パラメータ リストを保持する必須のヘッダー部分で始まります。次に、PL/SQL 匿名ブロックのように、宣言部分、実行部分、例外処理部分が続きます。単純なプロシージャは次のようになります。
CREATE PROCEDURE create_email_address ( -- プロシージャの見出し部分が始まりますname1 VARCHAR2 、name2 VARCHAR2 、company VARCHAR2 、email OUT VARCHAR2 ) -- プロシージャの見出し部分が終了するAS -- 宣言部分が始まります (オプション) error_message VARCHAR2 ( 30 ) := 'Email address is too long.' ; BEGIN -- 実行部分が始まります (必須) email := name1 || '.' || name2 || '@' || company ; EXCEPTION -- 例外処理部分が始まります (オプション) WHEN VALUE_ERROR THEN DBMS_OUTPUT . PUT_LINE ( error_message ); END create_email_address ;
上記の例は、スタンドアロン プロシージャを示しています。このタイプのプロシージャは、CREATE PROCEDURE ステートメントを使用してデータベース スキーマに作成され、保存されます。プロシージャは、PL/SQL パッケージ内に作成することもできます。これは、パッケージ プロシージャと呼ばれます。PL/SQL 匿名ブロック内に作成されたプロシージャは、ネストされたプロシージャと呼ばれます。データベースに保存されたスタンドアロン プロシージャまたはパッケージ プロシージャは、「ストアド プロシージャ」と呼ばれます。
プロシージャには、IN、OUT、IN OUT の 3 種類のパラメータがあります。
- IN パラメータは入力としてのみ使用されます。IN パラメータは参照によって渡されますが、非アクティブなプログラムによって変更される可能性があります。
- OUT パラメータの初期値は NULL です。プログラムはパラメータ値を割り当て、その値が呼び出し元のプログラムに返されます。
- IN OUT パラメータには初期値がある場合とない場合があります。その初期値は、呼び出されたプログラムによって変更される場合とされない場合があります。パラメータに加えられた変更は、デフォルトではコピーによって呼び出し元プログラムに返されますが、NO-COPY ヒントを使用すると参照によって渡すことができます。
PL/SQLは、Oracleデータベースの標準ext-procプロセスを介して外部プロシージャもサポートします。[9]
パッケージ
パッケージは、概念的にリンクされた関数、プロシージャ、変数、PL/SQL テーブルおよびレコード TYPE ステートメント、定数、カーソルなどのグループです。パッケージを使用すると、コードの再利用が促進されます。パッケージは、パッケージ仕様とオプションのパッケージ本体で構成されます。仕様はアプリケーションへのインターフェイスであり、使用可能な型、変数、定数、例外、カーソル、およびサブプログラムを宣言します。本体はカーソルとサブプログラムを完全に定義し、仕様を実装します。パッケージの 2 つの利点は次のとおりです。[10]
- モジュール方式、ビジネス ロジックのカプセル化/非表示、セキュリティ、パフォーマンスの向上、再利用性。関数のオーバーロードやカプセル化などのオブジェクト指向プログラミング機能をサポートします。
- パッケージ仕様で宣言された変数にはセッション スコープがあるため、パッケージ変数を使用するとセッション レベル (スコープ付き) 変数を宣言できます。
トリガー
データベーストリガーは、指定されたイベントが発生するたびに Oracle Database が自動的に呼び出すストアド プロシージャのようなものです。これは、データベースに格納され、繰り返し呼び出すことができる名前付きの PL/SQL ユニットです。ストアド プロシージャとは異なり、トリガーは有効または無効にできますが、明示的に呼び出すことはできません。トリガーが有効になっていると、トリガー イベントが発生するたびにデータベースによって自動的に呼び出されます (つまり、トリガーが起動します)。トリガーが無効になっていると、トリガーは起動しません。
トリガーは、CREATE TRIGGER ステートメントを使用して作成します。トリガー ステートメントと、そのステートメントが作用する項目に関して、トリガー イベントを指定します。トリガーは、項目 (テーブル、ビュー、スキーマ、またはデータベース) に対して作成または定義されます。また、タイミング ポイントも指定します。タイミング ポイントによって、トリガーがトリガー ステートメントの実行前または実行後のどちらで起動されるか、およびトリガー ステートメントが影響する各行に対して起動されるかどうかが決まります。
トリガーがテーブルまたはビューに作成される場合、トリガー イベントは DML ステートメントで構成され、トリガーは DML トリガーと呼ばれます。トリガーがスキーマまたはデータベースに作成される場合、トリガー イベントは DDL またはデータベース操作ステートメントで構成され、トリガーはシステム トリガーと呼ばれます。
INSTEAD OF トリガーは、ビューで作成された DML トリガー、または CREATE ステートメントで定義されたシステム トリガーのいずれかです。データベースは、トリガー ステートメントを実行する代わりに、INSTEAD OF トリガーを起動します。
トリガーの目的
トリガーは次の目的で作成できます。
- いくつかの派生列値を自動的に生成する
- 参照整合性の強制
- テーブルアクセスに関するイベントログと情報の保存
- 監査
- テーブルの同期レプリケーション
- セキュリティ権限の付与
- 不正な取引の防止
データ型
PL/SQL の主なデータ型には、NUMBER、CHAR、VARCHAR2、DATE、TIMESTAMP などがあります。
数値変数
変数名number ([ P , S ]) := 0 ;
数値変数を定義するには、プログラマーは変数タイプNUMBER を名前定義に追加します。(オプションの) 精度 (P) と (オプションの) スケール (S) を指定するには、これらを丸括弧で囲み、コンマで区切って追加します。(このコンテキストでの「精度」は変数が保持できる桁数を指し、「スケール」は小数点の後に続く桁数を指します。)
数値変数の他のデータ型の選択肢には、binary_float、binary_double、dec、decimal、double precision、float、integer、int、numeric、real、small-int、binary_integer が含まれます。
文字変数
変数名varchar2 (20 ):= 'テキスト' ;
-- 例:
address varchar2 ( 20 ) := 'lake view road' ;
文字変数を定義するには、プログラマーは通常、名前定義に変数タイプ VARCHAR2 を追加します。その後に、変数に格納できる最大文字数が括弧内に表示されます。
文字変数のその他のデータ型には、varchar、char、long、raw、long raw、nchar、nchar2、clob、blob、bfile などがあります。
日付変数
変数名date := to_date ( '01-01-2005 14:20:23' , 'DD-MM-YYYY hh24:mi:ss' );
日付変数には日付と時刻を含めることができます。時刻は省略できますが、時刻のみを含む変数を定義する方法はありません。DATETIME 型はありません。TIME 型はあります。ただし、ミリ秒またはナノ秒までの細かいタイムスタンプを含めることができる TIMESTAMP 型はありません。TO_DATE関数を使用して、文字列を日付値に変換できます。関数は、2 番目の引用符付き文字列を定義として使用して、最初の引用符付き文字列を日付に変換します。例:
to_date ( '31-12-2004' , 'dd-mm-yyyy' )
または
to_date ( '2004 年 12 月 31 日' 、'yyyy-mon-dd' 、'NLS_DATE_LANGUAGE = アメリカ' )
日付を文字列に変換するには、関数を使用しますTO_CHAR (date_string, format_string)。
PL/SQLはANSI日付リテラルと間隔リテラルの使用もサポートしています。[11]次の句は18か月の範囲を指定します。
WHERE dateField BETWEEN DATE '2004-12-30' - INTERVAL '1-6' YEAR TO MONTH AND DATE '2004-12-30'
例外
例外 (コード実行中のエラー) には、ユーザー定義と定義済みの 2 種類があります。
ユーザー定義の例外は、通常の実行を続行することが不可能であるとプログラマーが判断した状況で、RAISEまたはコマンドを使用して常に明示的に発生します。コマンドの構文は次のとおりです。
RAISE_APPLICATION_ERRORRAISE
RAISE <例外名> ;
Oracle 社では、、などのいくつかの例外を事前定義しています。各例外には、 SQL エラー番号と SQL エラー メッセージが関連付けられています。プログラマーは、関数と関数
を使用してこれらにアクセスできます。
NO_DATA_FOUNDTOO_MANY_ROWSSQLCODESQLERRM
特定の列のデータ型
変数名テーブル名.列名%type;
この構文は、参照されるテーブル上の参照される列の型の変数を定義します。
プログラマーは、次の構文を使用してユーザー定義のデータ型を指定します。
型data_typeはrecord ( field_1 type_1 := xyz 、field_2 type_2 := xyz 、... 、field_n type_n := xyz ) です。
例えば:
型t_address is record ( name address . name %type 、street address . street %type 、street_number address . street_number %type 、postcode address . postcode %type )を宣言します。v_address t_address ; begin select name 、street 、street_number 、postcode into v_address from address where rownum = 1 ; end ;
このサンプル プログラムは、 name、street、street_number、postcode のフィールドを含むt_addressと呼ばれる独自のデータ型を定義します。
したがって、この例によれば、データベースからプログラム内のフィールドにデータをコピーすることができます。
プログラマーはこのデータ型を使用して、v_addressという変数を定義し、ADDRESS テーブルからデータをロードしました。
プログラマーはドット表記法を使用して、このような構造内の個々の属性を指定できます。
v_address.street := 'ハイストリート';
条件文
次のコード セグメントは、IF-THEN-ELSIF-ELSE 構造を示しています。ELSIF と ELSE の部分はオプションなので、より単純な IF-THEN または IF-THEN-ELSE 構造を作成することもできます。
IF x = 1 THENステートメントのシーケンス 1 ; ELSIF x = 2 THENステートメントのシーケンス 2 ; ELSIF x = 3 THEN ステートメントのシーケンス 3 ; ELSIF x = 4 THENステートメントのシーケンス 4 ; ELSIF x = 5 THENステートメントのシーケンス 5 ; ELSEステートメントのシーケンス N ; END IF ;
CASE ステートメントは、いくつかの大きな IF-THEN-ELSIF-ELSE 構造を簡素化します。
CASE
WHEN x = 1 THENステートメントのシーケンス 1 ; WHEN x = 2 THENステートメントのシーケンス 2 ; WHEN x = 3 THENステートメントのシーケンス 3 ; WHEN x = 4 THENステートメントのシーケンス 4 ; WHEN x = 5 THENステートメントのシーケンス 5 ; ELSEステートメントのシーケンス N ; END CASE ;
CASE ステートメントは定義済みのセレクターと共に使用できます。
CASE x WHEN 1 THENステートメントのシーケンス 1 ; WHEN 2 THENステートメントのシーケンス 2 ; WHEN 3 THENステートメントのシーケンス 3 ; WHEN 4 THENステートメントのシーケンス 4 ; WHEN 5 THENステートメントのシーケンス 5 ; ELSEステートメントのシーケンス N ; END CASE ;
配列の取り扱い
PL/SQL では配列を「コレクション」と呼びます。この言語では 3 種類のコレクションが提供されています。
- 連想配列(インデックステーブル)
- ネストされたテーブル
- Varray(可変サイズ配列)
プログラマは varray の上限を指定する必要がありますが、索引付き表やネストされた表では必要ありません。言語には、コレクション要素の操作に使用されるコレクションメソッドがいくつか含まれています。たとえば、FIRST、LAST、NEXT、PRIOR、EXTEND、TRIM、DELETE などです。索引付き表は、PL/SQL の Ackermann 関数のメモ関数のこの例のように、連想配列をシミュレートするために使用できます。
連想配列(インデックステーブル)
インデックス テーブルを使用すると、配列を数値または文字列でインデックスできます。これは、キーと値のペアで構成されるJava マップに似ています。次元は 1 つだけで、制限はありません。
ネストされたテーブル
ネストされたテーブルでは、プログラマーは何がネストされているかを理解する必要があります。ここでは、複数のコンポーネントで構成される新しい型が作成されます。その型を使用してテーブルに列を作成し、その列内にそれらのコンポーネントをネストします。
Varray(可変サイズ配列)
Varray を使用する場合、「可変サイズ配列」というフレーズの「可変」という単語は、配列のサイズには当てはまらないことを理解する必要があります。配列の宣言サイズは実際には固定です。配列内の要素数は、宣言されたサイズまで可変です。つまり、可変サイズ配列のサイズはそれほど可変ではないと言えます。
カーソル
カーソルは、SELECT またはデータ操作言語 (DML) ステートメント (INSERT、UPDATE、DELETE、または MERGE) からの情報を格納するプライベート SQL 領域へのポインタです。カーソルは、SQL ステートメントによって返される行 (1 つ以上) を保持します。カーソルが保持する行のセットは、アクティブ セットと呼ばれます。[12]
カーソルは明示的または暗黙的に使用できます。FOR ループでは、クエリが再利用される場合は明示的なカーソルを使用する必要があります。それ以外の場合は暗黙的なカーソルが推奨されます。ループ内でカーソルを使用する場合は、一括収集が必要な場合や動的 SQL が必要な場合は、FETCH を使用することをお勧めします。
ループ
PL/SQL は定義上手続き型言語であるため、基本的な LOOP 文、WHILE ループ、FOR ループ、カーソル FOR ループなど、いくつかの反復構造が用意されています。Oracle 7.3 以降、ストアド プロシージャおよび関数からレコードセットを返すことができる REF CURSOR 型が導入されました。Oracle 9i では定義済みの SYS_REFCURSOR 型が導入されたため、独自の REF CURSOR 型を定義する必要がなくなりました。
LOOP ステートメント
<<parent_loop>>
LOOP
ステートメント
<<child_loop>>
ループステートメントexit parent_loop when < condition > ; -- 両方のループを終了しますexit when < condition > ; -- 制御を parent_loop に戻しますend loop child_loop ; if < condition > then continue ; -- 次の反復に進みますend if ;
exit when <条件> ; END LOOP parent_loop ;
[13]
ループは、EXIT キーワードを使用するか、例外 を発生させることによって終了できます。
FORループ
DECLARE
var NUMBER ; BEGIN /* 注意: PL/SQL のループ変数は新しい宣言であり、ループ内のみに有効です */ FOR var IN 0 .. 10 LOOP DBMS_OUTPUT . PUT_LINE ( var ); END LOOP ;
IF var IS NULL THEN DBMS_OUTPUT . PUT_LINE ( 'var is null' ); ELSE DBMS_OUTPUT . PUT_LINE ( 'var is not null' ); END IF ; END ;
出力:
0 1 2 3 4 5 6 7 8 9 10 var が null です
カーソルFORループ
FOR RecordIndex IN ( SELECT person_code FROM people_table ) LOOP DBMS_OUTPUT . PUT_LINE ( RecordIndex . person_code ); END LOOP ;
カーソル for ループは自動的にカーソルを開き、そのデータを読み込んで、再びカーソルを閉じます。
代わりに、PL/SQL プログラマーは、カーソルの SELECT 文を事前に定義して、たとえば、再利用を可能にしたり、コードをより理解しやすくしたりすることができます (特に、長いクエリや複雑なクエリの場合に便利です)。
DECLARE
CURSOR cursor_person IS SELECT person_code FROM people_table ; BEGIN FOR RecordIndex IN cursor_person LOOP DBMS_OUTPUT . PUT_LINE ( recordIndex . person_code ); END LOOP ; END ;
FOR ループ内の person_code の概念は、ドット表記 (「.」) で表現されます。
レコードインデックス. person_code
動的SQL
プログラマーは簡単な SQL ステートメントを使用してデータ操作言語(DML) ステートメントを PL/SQL コードに直接埋め込むことができますが、データ定義言語(DDL) では、PL/SQL コードにさらに複雑な「動的 SQL」ステートメントが必要です。ただし、DML ステートメントは、一般的なソフトウェア アプリケーションの PL/SQL コードの大部分を支えています。
PL/SQL 動的 SQL の場合、Oracle データベースの初期バージョンでは複雑な OracleDBMS_SQLパッケージ ライブラリを使用する必要がありました。ただし、最近のバージョンでは、よりシンプルな「ネイティブ動的 SQL」と関連する構文が導入されていますEXECUTE IMMEDIATE。
類似の言語
PL/SQLは、他のリレーショナルデータベースに関連付けられた組み込み手続き型言語と同様に機能します。たとえば、Sybase ASEとMicrosoft SQL ServerにはTransact-SQLがあり、PostgreSQLにはPL/pgSQL(ある程度PL/SQLをエミュレートします)があり、MariaDBにはPL/SQL互換性パーサーが含まれています[14]。IBM Db2には、ISO SQLのSQL/PSM標準 に準拠したSQL手続き型言語が含まれています[15]。
PL/SQLの設計者は、その構文をAdaの構文に倣った。AdaとPL/SQLはどちらもPascalを共通の祖先としており、PL/SQLもほとんどの点でPascalに似ている。しかし、PL/SQLパッケージの構造は、Borland DelphiやFree Pascalユニットによって実装された基本的なObject Pascalプログラム構造とは似ていない。プログラマーは、PL/SQLパッケージでパブリックおよびプライベートのグローバルデータ型、定数、および静的変数を定義できる。[16]
PL/SQL では、クラスを定義し、これを PL/SQL コード内のオブジェクトとしてインスタンス化することもできます。これは、Object Pascal、C++、Javaなどのオブジェクト指向プログラミング言語での使用法に似ています。PL/SQL では、クラスを「抽象データ型」(ADT) または「ユーザー定義型」(UDT) として参照し、PL/SQL ユーザー定義型ではなくOracle SQL データ型として定義します。これにより、 Oracle SQL エンジンとOracle PL/SQL エンジンの両方でクラスを使用できます。抽象データ型のコンストラクタとメソッドは、PL/SQL で記述されます。結果として得られる抽象データ型は、PL/SQL のオブジェクト クラスとして動作できます。このようなオブジェクトは、Oracle データベース テーブル内の列値として保持することもできます。
PL/SQLは、表面的な類似点はあるものの、Transact-SQLとは根本的に異なります。一方から他方へのコードの移植は、2つの言語の機能セットの違いだけでなく[17] 、OracleとSQL Serverが同時実行性とロックを処理する方法の非常に大きな違いのために、通常は簡単な作業ではありません。
StepSqlite製品は、人気のある小規模データベースSQLite用の PL/SQL コンパイラであり、PL/SQL 構文のサブセットをサポートしています。Oracle のBerkeley DB 11g R2 リリースでは、Berkeley DB に SQLite のバージョンを含めることで、人気のある SQLite API に基づくSQLのサポートが追加されました。 [18]そのため、StepSqlite は Berkeley DB で PL/SQL コードを実行するサードパーティ ツールとしても使用できます。[19]
参照
- T-SQL
- SQL言語
- SQL/PSM
- PL/SQL エディター
- リレーショナルデータベース管理システム
参考文献
- ^ Serge Rielau (srielau@ca.ibm.com)、SQL アーキテクト、STSM、IBM。「DB2 10: Linux、UNIX、Windows 版 DB2 10 で Oracle アプリケーションを実行する」。Ibm.com。2012年 7 月 26 日閲覧。
{{cite web}}: CS1 maint: multiple names: authors list (link) - ^ Steven Feuerstein (1995)、「Oracle PL/SQL プログラミング」、第 1 版。
- ^ 「SQL/PSM による Oracle コンプライアンス」。
- ^ 「Oracle Serverの機能」。Oracle 。 2020年9月21日閲覧。
- ^ 「PL/SQL 無名ブロック」。Oracle。2020年 9 月 21 日閲覧。
- ^ 「データベースSQLリファレンス」。Oracle 。 2020年9月21日閲覧。
- ^ Nanda, Arup; Feuerstein, Steven (2005). Oracle PL/SQL for DBAs. O'Reilly シリーズ. O'Reilly Media, Inc. pp. 122, 429. ISBN
978-0-596-00587-0. 2011-01-11に取得。
パイプライン テーブル関数は、結果セットをコレクションとして繰り返し返します。各行はコレクションに割り当てる準備が整うと、関数から「パイプ出力」されます。
- ^ 「データベースSQLリファレンス」。Oracle 。 2020年9月21日閲覧。
- ^ Gupta, Saurabh K. (2012)。「5: 高度なインタフェース メソッドの使用」。上級 Oracle PL/SQL 開発者ガイド。プロフェッショナル エクスペリエンスの凝縮 (第 2 版)。バーミンガム: Packt Publishing Ltd (2016 年発行)。p. 143。ISBN
9781785282522. 2017-06-08に取得
。PL/SQL ランタイム エンジンが外部プロシージャ コールを検出すると、Oracle データベースは extproc プロセスを開始します。データベースは、コール仕様から受け取った情報をプロセスに渡します
extproc。これにより、プロセスはライブラリ内で外部プロシージャを見つけ、指定されたパラメータを使用して外部プロシージャを実行できます。プロセスextprocは、動的リンク ライブラリをロードし、外部プロシージャを実行して、結果をデータベースに返します。 - ^ 「PL/SQL プロシージャおよびパッケージのコーディング」。Oracle。2020年 9 月 21 日閲覧。
- ^ 「リテラル」。Oracle iSQL リファレンス 10g リリース 2 (10.2)。Oracle。2009年 3 月 20 日取得。
- ^ フォイアシュタイン、スティーブン。 「カーソルの操作」。oracle.com。
- ^ 「データベース PL/SQL ユーザーズ・ガイドおよびリファレンス」。download.oracle.com。
- ^ 「MariaDB Server 10.3 の新機能」(PDF) . MariaDB . 2018 年 8 月 21 日閲覧。
- ^ 「SQL PL」。Publib.boulder.ibm.com 。 2012年7月26日閲覧。
- ^ Oracle ドキュメント「PL/SQL のプライベート項目とパブリック項目」
- ^ 「Oracle から SQL Server への移行 - T-SQL、PL/SQL の違い: Narayana Vyas Kondreddi のホームページ」。vyaskn.tripod.com。
- ^ Burd, Gregory (2010 年 3 月 24 日)。「@humanications SQLite API を再実装したのではなく、ストレージに Berkeley DB を使用するバージョンの SQLite を組み込みました (btree.c を置き換えます)」。
- ^ 「Official Berkeley DB FAQ」。Oracle Corporation。2010年3 月 30 日閲覧。Berkeley
DB は PL/SQL をサポートしていますか?
さらに読む
- Feuerstein, Steven ; Bill Pribyl (2014)。Oracle PL/SQL プログラミング(第 6 版)。O'Reilly & Associates。ISBN 978-1449324452。
- Naudé, Frank (2005 年 6 月 9 日)。「Oracle PL/SQL FAQ rev 2.08」。
外部リンク
- Oracle FAQ: PL/SQL
- オラクルテクノロジーセンター
- Oracle Tahiti 検索エンジン
- モーガンの図書館
- ORACLE-BASE: PL/SQL の記事
