ストアドプロシージャ

4D - Documentation   French   English   German   日本語   4D Serverテーマリスト   4D Serverインデックス   戻る   前   次

version 2004 (Modified)


SQLベースのストアドプロシージャとは?


ストアドプロシージャという表現は、SQLベースのサーバの世界に由来しています。クライアントワークステーションがSQLベースのサーバに要求を送信する時、実際にはSQLサーバに対してSQL言語で記述されたテキストを送信します。この要求は、実行される前にSQLサーバ上で解析され、解釈されます。要求のソースコードのサイズが大きく、1回のセッション中に要求が何度も送信される場合には、送られる要求の回数が多いほど、ネットワーク経由でソースコードを送信、解析し、解釈する時間が長くなることは明らかです。

そこで、ネットワーク経由で要求を送信し、解析および解釈を一度だけ行い、クライアントワークステーションから受信するたびにこれを実行する方法を探しました。この解決方法は、要求のソースコード (つまりプロシージャ) をサーバ側に保存し、クライアントワークステーションには実行するプロシージャの名前だけで構成される要求を送らせることでした。結果的に、このプロシージャはサーバ上にストアされるため、"ストアドプロシージャ"という用語になっています。

SQLベースのストアドプロシージャは、クライアントワークステーションから引数を受信し、実現するタスクを (同期的または非同期的に) 実行し、最終的に結果をクライアントワークステーションに戻すことができるプロシージャであるということに注意してください。クライアントワークステーションがストアドプロシージャの実行を開始すると、ある程度、サーバマシンにコードの実行を任せます。

4D Server のストアドプロシージャとは?


4D Server では、業界で通用しているストアドプロシージャという名称を使用していますが、4D Server のストアドプロシージャの機能は、通常のストアドプロシージャの概念をはるかに超えています。

ローカルモードの4DでNew processのようなコマンドを使用すると、メソッドを実行できるユーザプロセスを開始することができます。このメソッドはプロセスメソッドと呼ばれています (4D Language Referenceマニュアルのプロジェクトメソッド参照)。

4D Server上でもクライアントマシンと同様の操作が可能です。さらにExecute on serverコマンドを使用すると、4D Serverマシン上でメソッドを実行できるユーザプロセスを開始できます。EXECUTE ON CLIENTを使用すれば異なるクライアント上の他のプロセスでメソッドを実行できます。

両ケースでこのメソッドはストアドプロシージャと呼ばれ、(用語の濫用になりますが) サーバマシンやクライアント上で開始されたプロセスもストアドプロシージャと呼ばれます。

重要: SQL ベースのストアドプロシージャと4D Server のストアドプロシージャの本質的な違いは、SQL ベースのストアドプロシージャではSQL プロシージャを実行し、4D Server のストアドプロシージャではスタンドアロン4Dプロセスを実行するという点にあります。

4Dストアドプロシージャのアーキテクチャ


通常のプロセスと同様に、ストアドプロシージャには次のような独自の環境があります:

テーブルごとのカレントセレクション: 各ストアドプロシージャには、個別のカレントセレクションがあります。1 つのテーブルは、別々のストアドプロシージャで異なるカレントセレクションを持つことができます。

テーブルごとのカレントレコード: 各テーブルは、ストアドプロシージャごとに異なるカレントレコードを持つことができます。

変数: 各ストアドプロシージャには独自のプロセス変数があります。プロセス変数は、その変数が設定されたストアドプロシージャの範囲内でのみ認識されます。

デフォルトテーブル: E各ストアドプロシージャには、独自のデフォルトテーブルがあります。

プロセスセット: 各ストアドプロシージャには、独自のプロセスセットがあります。

エラー処理: 各ストアドプロシージャには、独自のエラー処理メソッドを持てます。

デバッガウィンドウ: 各ストアドプロシージャには、独自のデバッガウィンドウを持てます。

ユーザインタフェースの点では、ストアドプロシージャは、ウィンドウを開き、データを表示する (例えばDISPLAY RECORDを使用) ことができます。

4Dクライアントマシン上で実行されるストアドプロシージャではデータ入力ができます。

一方、サーバ上で実行されるストアドプロシージャではデータ入力を開始する (例えばADD RECORDを使用) ことはできません。これは、サーバマシン上にデータ入力カーネルがないためです。

ストアドプロシージャは、システム (ハードウェアおよびメモリ) が許す限りいくつでも開始することができます。事実、4D Server マシンは、4DクライアントおよびWeb ブラウザに応答するマシンであるだけではなく、サーバマシンおよびリモート4Dマシン上で実行中の他のプロセスと対話するプロセスを実行するマシンである、という見方をする必要があります。

4Dがマシン上で実行されるユーザプロセスのマルチタスク環境を提供するのと同じ方法で、4D Serverはストアドプロシージャに対してマルチタスク環境を提供します。たとえば、4D Server はプロセス間通信用にストアドプロシージャで使用できるインタープロセス変数テーブルを管理しています。

Note: "サーバ上で実行"メソッド属性を使用して、サーバ上のプロセスでメソッドを実行することもできます。ただしこの場合メソッドは、クライアントプロセスに対応するサーバ上のクライアントプロセスで実行されます。つまりクライアントプロセスの環境を使用できます。この場合、これは4Dのストアドプロシージャではありません。詳細はサーバ上で実行属性を参照してください。

ストアドプロシージャの機能


データ入力を除き、4D Language Referenceマニュアルで説明されている、ほとんどすべてのプロセスおよびコマンドの機能は、ストアドプロシージャにも適用されます。

ストアドプロシージャではレコードの追加、検索、並べ替え、更新、削除が可能です。ストアドプロシージャではセットや命名セレクションの使用、ディスク上のドキュメントファイルへのアクセス、BLOB を使用した作業、レコードの印刷等が行えます。ローカルの4Dマシン上で作業を行う代わりに、サーバマシン上や他の4Dクライアントマシン上で実行していると考えてください。

ストアドプロシージャの明らかな利点は、データベースエンジンがあるサーバマシン上でローカルに実行されるということです。例えば、ネットワーク経由でAPPLY TO SELECTIONを行うと効率的ではありませんが、ストアドプロシージャ内では効率良く実行されます。SPベースの読み込み (例題)に示された例では、“スマート”なストアドプロシージャを使用して、大幅なパフォーマンスの最適化を実現しています。

クライアントマシン上で実行されるストアドプロシージャを使用すれば、タスクの分割やクライアントマシン間の通信を最適化できます。複数のマシンでストアドプロシージャを実行する例題は、4D Language Reference内のREGISTER CLIENTを参照してください。

しかし、ストアドプロシージャアーキテクチャの最も重要な利点は、4D Server に追加の世界をもたらすところです。ストアドプロシージャを利用すると、独自の4D Serverサービスを実現することができます。これを制限するのは想像力だけです。SPベースのサービス (例題)の節の例では、4D Server またはサーバマシンについての情報をクライアントに提供するストアドプロシージャを示しています。例えば、サーバマシンのボリュームを一覧表示することが可能です。この例は、ディレクトリ情報やドキュメント情報をクライアントに返すように簡単に拡張することができます。

(サーバ上で実行される) ストアドプロシージャが行わないこと


一般に言って、サーバ上で実行されるストアドプロシージャはインタフェース (メニューやウィンドウ、フォームなど) を扱うべきではありません。実際インタフェースはサーバ上では管理されません。

サーバマシン上でダイアログボックスを表示するコマンドやデータ入力のためにダイアログボックスを表示するようなコマンドは避けるべきです。

以下はサーバ上で実行されるストアドプロシージャ内で使用すべきでないコマンドのリストです。コマンドは3つのグループ化されます:

サーバ上で禁止されるコマンド

以下のコマンドの1つををストアドプロシージャ内で使用したら、4D Server 上で使ってはいけないというアラートが表示されます。エラーは#67 が返ります。ON ERR CALLコマンドでインストールされたメソッドを通し、受け取ることができます。

ACCUMULATE

ADD RECORD

ADD SUBRECORD

APPEND MENU ITEM

BREAK LEVEL

CALL PROCESS

CHANGE LICENSES

Count menu items

Count menus

CREATE DATA FILE

DELETE MENU ITEM

DISABLE MENU ITEM

DISPLAY SELECTION

EDIT ACCESS

ENABLE MENU ITEM

FILTER EVENT

Get menu item

Get menu item key

Get menu item mark

Get menu item style

Get menu title

GRAPH TABLE

HIDE MENU BAR

INSERT MENU ITEM

Level

Menu selected

MODIFY RECORD

MODIFY SELECTION

MODIFY SUBRECORD

ON EVENT CALL

OPEN DATA FILE

Open external window

PAGE BREAK

PAGE SETUP

PRINT SETTINGS

Printing page

QR REPORT

QUERY BY EXAMPLE

REMOVE PICTURE FROM LIBRARY

SET MENU ITEM

SET MENU ITEM KEY

SET MENU ITEM MARK

SET MENU ITEM STYLE

SET PICTURE TO LIBRARY

SHOW MENU BAR

Subtotal

・サーバ上で使用すべきでないコマンド

ストアドプロシージャの中で下記のコマンドを使用しないことを強くお勧めします。これらは、サーバをブロックすることができ、エラーが生じるかもしれません。そしてどのような場合でも正しく実行できません。特別なエラーコードはありません。

ACCEPT

Activated

ADD DATA SEGMENT

After

APPEND TO PASTEBOARD

APPEND TO LIST

Before

BLOB TO DOCUMENT

BLOB to list

BRING TO FRONT

BUTTON TEXT

CANCEL

CHANGE CURRENT USER

CHANGE PASSWORD

CLEAR PASTEBOARD

CLEAR LIST

Copy list

Count list items

Count screens

Create document (1)

Create resource file (1)

Current form page

Current form table

Current user

C_GRAPH

Deactivated

DELETE LIST ITEM

DELETE USER

DIALOG

DISABLE BUTTON

DRAG AND DROP PROPERTIES

DRAG WINDOW

Drop position

During

ENABLE BUTTON

ERASE WINDOW

EXPORT DATA (1)

FILTER KEYSTROKE

Find window

FIRST PAGE

Focus object

FONT

FONT LIST

Font name

Font number

FONT SIZE

FONT STYLE

Form event

Frontmost process

Frontmost window

GET PASTEBOARD

Get edited text

GET FORM PROPERTIES

GET GROUP LIST

GET GROUP PROPERTIES

GET HIGHLIGHT

GET LIST ITEM

GET LIST ITEM PROPERTIES

GET LIST PROPERTIES

GET MOUSE

GET OBJECT RECT

GET PICTURE FROM PASTEBOARD

Get text from pasteboard

GET USER LIST

GET USER PROPERTIES

GET WINDOW RECT

Get window title

GOTO AREA

GOTO PAGE

GRAPH SETTINGS

HIDE PROCESS

HIDE TOOL BAR

HIDE WINDOW

HIGHLIGHT RECORDS

HIGHLIGHT TEXT

IMPORT DATA (1)

In break

In footer

In header

INPUT FORM

INSERT LIST ITEM

INVERT BACKGROUND

Is a list

Is user deleted

Keystroke

LAST PAGE

List item parent

List item position

LIST TO BLOB

Load list

MAXIMIZE WINDOW

Menu bar height

Menu bar screen

MINIMIZE WINDOW

Modified

MOVE OBJECT

New list

NEXT PAGE

Next window

Old

Open document (1)

Open resource file (1)

ORDER BY (2)

OUTPUT FORM

Outside call

Pop up menu

POST CLICK

POST EVENT

POST KEY

PREVIOUS PAGE

QUERY BY FORMULA (2)

QUERY (2)

REDRAW

REDRAW LIST

REDRAW WINDOW

REGISTER CLIENT

REJECT

SAVE LIST

SCREEN COORDINATES

SCREEN DEPTH

Screen height

Screen width

Select folder

Selected list items

SELECT LIST ITEMS BY POSITION

SELECT LIST ITEMS BY REFERENCE

SELECT LOG FILE

Self

SET CHOICE LIST

SET COLOR

SET CURSOR

SET ENTERABLE

SET FIELD TITLES

SET FILTER

SET FORMAT

Set group properties

SET LIST ITEM

SET LIST ITEM PROPERTIES

SET LIST PROPERTIES

SET PICTURE TO PASTEBOARD

SET RGB COLORS

SET SCREEN DEPTH

SET TABLE TITLES

SET TEXT TO PASTEBOARD

SET TIMER

Set user properties

SET VISIBLE

SET WINDOW RECT

Shift down

SHOW PROCESS

SHOW WINDOW

SORT LIST

Test pasteboard

User in group

Validate password

Window kind

WINDOW LIST

Window process

(1) 第一引数が空の文字列の場合のみ

(2) シンタックスの結果がダイアログを表示する場合のみ (例: SORT ([table]))

サーバ上で効果がないコマンド

以下のコマンドはサーバ上のストアドプロシージャで呼び出された場合、効果がありません。特定のエラーコードは返されません。

GRAPH

MENU BAR

MESSAGES OFF

MESSAGES ON

SET MENU BAR

SHOW TOOL BAR

ストアドプロシージャの開始方法


・4Dのメソッド実行ダイアログボックスでストアドプロシージャを開始できます:

メソッドを4D Serverあるいは他の4Dクライアントマシン上で実行できます。このリストに4Dクライアントを表示させるためには、まずクライアントを登録する必要があります (クライアントマシン上でのストアドプロシージャとREGISTER CLIENT コマンド参照)。

・さらに、4DでExecute on serverEXECUTE ON CLIENTコマンドを使用して、プログラムからストアドプロシージャを開始することも可能です。

Note: サーバ上のストアドプロシージャに対し、リモートの4DからDELAY PROCESSPAUSE PROCESSRESUME PROCESSなどのプロセス管理コマンドを使用することはできません。

・4D Server上で実行されるメソッド (サーバデータベースメソッド、サーバ上で実行属性付きのメソッド、ストアドプロシージャ) から、Execute on serverまたはNew processまたはEXECUTE ON CLIENTを使用して、ストアドプロシージャを開始できます。

ストアドプロシージャとユーザプロセス間のプロセス間通信についての詳細


ストアドプロシージャ間の通信には、次の方法を使用します:

・インタープロセス変数

・ローカルセマフォまたはグローバルセマフォ

・レコード

・インタープロセスセットおよびインタープロセス命名セレクション

GET PROCESS VARIABLESET PROCESS VARIABLEVARIABLE TO VARIABLEコマンド

4D Language Referenceマニュアルで、関連する箇所を参照してください。4Dコマンドは、クライアントマシンのスコープ内で動作する場合と同様に、ストアドプロシージャを実行するサーバまたはクライアントマシンのスコープ内で動作することに注意してください。

Note: CALL PROCESSおよびOutside callメカニズムは、サーバマシン上では意味がありません。ストアドプロシージャには、データ入力のためのユーザインタフェースがないためです。

さらにもう1 つ重要な機能があります。クライアントユーザプロセス (クライアントマシンで実行されるプロセス) は、GET PROCESS VARIABLESET PROCESS VARIABLEVARIABLE TO VARIABLEコマンドを使用して、ストアドプロシージャのプロセス変数 (*) を読み込んだり、書き込むことができます

(*) サーバマシンのインタープロセス変数と同様

重要: GET PROCESS VARIABLESET PROCESS VARIABLEVARIABLE TO VARIABLEコマンドを使用して行う、“マシン間”のプロセス通信は、クライアントからサーバに対してのみ可能です。ストアドプロシージャの変数を読み込んだり、書き込んだりするのは常にクライアントのプロセスです。

参照

SPベースのサービス (例題), SPベースの読み込み (例題).


4D - Documentation   French   English   German   日本語   4D Serverテーマリスト   4D Serverインデックス   戻る   前   次