例3: CREATE ROLEを使用した明示的なロール作成とGRANTを使用した暗黙的なロール作成
この例では、OpenVMS権利識別子と一致するロールの作成を示します。CREATE ROLE文を最初に使用し、次にGRANT文を使用します。GRANTでは、GRANT文の副次的な影響についてデータベース管理者に知らせる警告メッセージが表示されます。
SQL> create database cont> filename SAMPLE cont> security checking is internal; SQL> show roles; Roles in database with filename sample No Roles found SQL> create role dba_mgr identified externally; SQL> show roles; Roles in database with filename sample DBA_MGR SQL> grant saldb_user to smith; %RDB-W-META_WARN, metadata successfully updated with the reported warning -RDMS-W-PRFCREATED, some users or roles were created SQL> show roles; Roles in database with filename sample DBA_MGR SALDB_USER SQL> |
Oracle Rdbデータベースで、外部ルーチン定義をスキーマ・オブジェクトとして作成します。外部ルーチンとは、外部ファンクションと外部プロシージャの両方を意味します。ルーチン定義により、3GL言語で記述されたサブプログラム(ファンクションまたはプロシージャ)に関する情報がデータベースに格納されます。ルーチン定義とルーチン・イメージはそれぞれ独立しており、一方が存在しない場合でも、もう一方は存在できます。ただし、外部ルーチンを起動するには、ルーチン定義とルーチン・イメージの両方が必要です。SQLでは、値式を指定できる任意の場所から外部ファンクションを起動できます。外部プロシージャは、複合文のCALL文 を使用して起動します。
CREATE FUNCTION文とCREATE PROCEDURE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
BIND ON CLIENT SITE
BIND ON SERVER SITE
外部ルーチン実行の実行モデルおよび環境を選択します。CLIENTサイト・バインディングにより、外部ルーチンがアクティブ化され、OpenVMSデータベース・クライアント(アプリケーション)・プロセスで実行されます。これはデフォルトのバインディングです。このバインディングによって最も効率的な実行特性が提供され、I/Oデバイスなどのリソースを共有し、外部ルーチンをクライアント・アプリケーションの一部と同様にデバッグできます。ただし、このバインディングはアドレス空間の制限を受ける場合があります。データベース・バッファと仮想メモリーを共有しているため、このバインディングはクライアント・プロセスのシステム・ユーザー環境に限定されており、高レベルの権限が必要なアプリケーションの実行時に、外部ルーチンを実行することは禁止されています。
SERVERサイト・バインディングにより、外部ルーチンがデータベース・クライアントおよびサーバーとは別のプロセスでアクティブ化されます。このプロセスは、データベース・プロセスと同じノードで開始されます。このバインディングでは、適切な実行特性、より大きいアドレス空間、実際のセッション・ユーザー環境が提供され、高レベルの権限によるクライアント・プロセス制約を受けません。ただし、このバインディングでは、クライアントとI/Oデバイスなどのリソースを共有できないため(特に、クライアント対話型端末への接続がないため)、一般的にルーチンをデバッグできません。
BIND SCOPE CONNECT
BIND SCOPE TRANSACTION
外部ルーチンがアクティブ化される有効範囲と、外部ルーチンが非アクティブ化されるポイントを定義します。デフォルトの有効範囲はCONNECTです。
- CONNECT
データベースからデタッチする(またはデタッチせずに終了する)と、アクティブなルーチンが非アクティブ化されます。- TRANSACTION
トランザクションが中止(COMMITまたはROLLBACK)されると、アクティブなルーチンが非アクティブ化されます。トランザクションを実行していない場合、有効範囲はCONNECTに戻ります。
COMMENT IS 'string'
パラメータまたは外部ルーチンの性質について説明します。SQLでは、SHOW FUNCTION文またはSHOW PROCEDURE文の実行時にコメントのテキストが表示されます。コメントは一重引用符(')で囲み、コメント内の複数の行はスラッシュ(/)で区切ります。DEFAULT value-expr
INモードで定義したファンクションまたはプロシージャに対するパラメータのデフォルト値を指定します。このパラメータを省略するか、CALL文の引数リストまたはファンクションの起動でDEFAULTキーワードが指定される場合は、この句に指定したvalue-exprが使用されます。値式を明示的に指定しない場合は、パラメータでNULLがデフォルトとして使用されます。DEFAULT LOCATION
LOCATION 'image-location'
外部ルーチン・イメージのデフォルトの位置または特定の位置です。結果ファイルの仕様には、タイプ.exeが含まれている必要があります。これは、イメージ・ファイルの仕様または単に論理名になります。
SQLでは、次の要素の組合せに基づいてルーチンを選択します。
- イメージ文字列
位置はDEFAULT LOCATIONにデフォルトで設定されます。これはファイル仕様文字列RDB$ROUTINESを表します。- 論理名変換
WITH ALL LOGICAL_NAME TRANSLATION句およびWITH SYSTEM LOGICAL_NAME TRANSLATION句によって、ロケーション文字列にある論理名の変換方法を指定します。
変換オプションが指定されていない場合、またはWITH ALL LOGICAL_NAME TRANSLATIONが指定されている場合は、論理名はデフォルトの方法で変換されます。
If WITH SYSTEM LOGICAL_NAME TRANSLATIONが指定されている場合は、ロケーション文字列の論理名は、SYSTEM論理名表のEXECUTIVE_MODE論理名のみを使用して展開されます。
DETERMINISTIC
NOT DETERMINISTIC
この句は、問合せの有効範囲内で外部ファンクションの評価を制御します。
- NOT DETERMINISTIC
NOT DETERMINISTIC句を指定すると、該当するファンクションが(単一問合せの有効範囲で)表示されるたびに、そのファンクションが強制的に評価されます。ファンクションの起動ごとに異なる結果が返される場合は、DETERMINISTIC句を使用する必要があります。- DETERMINISTIC
DETERMINISTIC句を指定すると、(単一問合せの有効範囲で)該当するファンクション式の単一評価が行われ、その結果の値が対応するファンクション式のすべての該当箇所で使用されます。DETERMINISTIC句を使用すると、この句を使用するたびにファンクションを起動するかどうかが評価されます。
次に例を示します。
SELECT * FROM T1 WHERE F1() > 0 AND F1() < 20;
F1ファンクションをDETERMINISTICとして定義すると、オプティマイザによっては、ファンクションF1()は1回のみ評価されます。F1ファンクションをNOT DETERMINISTICとして定義すると、ファンクションF1()は2回評価されます。
デフォルトはDETERMINISTICです。
プロシージャ定義では、DETERMINISTIC句またはNOT DETERMINISTIC句は使用できません。
external-body-clause
ルーチン名、ルーチンの実行可能イメージの位置、ルーチンをコーディングする言語など、ルーチンのキー特性を識別します。external-body-name
外部ルーチン名です。この名前を指定しない場合は、external-routine-name句で指定した名前がSQLに使用されます。この名前により、ルーチン本体の起動ごとにコールされるルーチン・エントリ・アドレスが定義されます。location句で選択された外部ルーチン・イメージには、この名前付きルーチンが必要です。
引用符付きでない名前は、大文字に変換されます。
external-location-clause
ルーチン本体とルーチン・オプションを含むイメージを参照するファイル仕様により、エントリ・ポイントを通知します。external-routine-name
外部ルーチン名です。この名前は外部ルーチンおよびスキーマのストアド・ルーチンで一意にする必要があり、別名で、または(マルチスキーマ・データベースの場合は)スキーマ名で修飾できます。FUNCTION
外部ファンクション定義を作成します。このファンクションはINパラメータのリストをオプションで受け入れ、常に値を返し、値式の要素として名前で参照されます。
GENERAL PARAMETER STYLE
これはPARAMETER STYLE GENERALと同じ意味ですが、廃止予定です。LANGUAGE language-name
外部ルーチンがコーディングされたホスト言語の名前です。ADA、C、COBOL、FORTRAN、PASCALまたはGENERALを指定できます。GENERALキーワードを使用すると、任意の言語で記述したルーチンをコールできます。言語固有の情報の詳細は、「使用方法」を参照してください。
LANGUAGE SQL
ルーチンをコールする言語を指定します。mechanism-clause
受渡しメカニズムを定義します。次のリストでは、受渡しメカニズムについて説明します。
- BY DESCRIPTOR
『OpenVMS Calling Standard』を実装した言語コンパイラでコンパイルしたルーチンに対して、文字データをパラメータ・アクセス・モードで渡すことができます。- BY LENGTH
LENGTH受渡しメカニズムは、DESCRIPTOR受渡しメカニズムと同一のものです。- BY REFERENCE
実際のデータへの参照として、パラメータ・アクセス・モードでデータを渡すことができます。
これはパラメータのデフォルトの受渡しメカニズムです。また、文字データを返すファンクション値のデフォルトの受渡しメカニズムでもあります。- BY VALUE
データを値として、INパラメータ・アクセス・モードでルーチンに渡し、ファンクションで値を返すことができます。
これは文字以外のデータを返すファンクション値のデフォルトの受渡しメカニズムです。
notify-clause
特定の外部ルーチンまたはデータベース関連のイベントが発生した場合に、2番目に呼び出される(通知される)ルーチンの名前を指定します。この名前により、通知ルーチンの起動ごとにコールされるルーチン・エントリ・アドレスが定義されます。location句で選択された外部ルーチン・イメージには、この名前付きルーチンが必要です。通知ルーチンに関連するイベントはON BIND、ON CONNECTおよびON TRANSACTIONです。複数のイベントを指定できます。
次に、イベントと各イベントの有効範囲について説明します。
BIND ルーチンのアクティブ化からルーチンの非アクティブ化 CONNECT データベース・アタッチからデータベース切断 TRANSACTION 開始トランザクションからコミットまたはロールバック・トランザクション
parameter-list
外部ルーチンのオプションのパラメータです。それぞれのパラメータについて、パラメータ・アクセス・モード(IN、OUTおよびINOUT)、パラメータ名、データ型、受渡しメカニズム(DESCRIPTOR、LENGTH、REFERENCEまたはVALUEによる)を指定できます。パラメータ・アクセス・モード(IN、OUTおよびINOUT)はオプションであり、パラメータへのアクセス方法(読取り、書込み、またはその両方)を指定します。INは読取り専用、OUTは書込み専用、INOUTは読取りおよび書込みを表します。パラメータ・アクセス・モードはINにデフォルト設定されます。
INパラメータ・アクセス・モードのみ、外部ファンクションに対してパラメータで指定できます。いずれかのパラメータ・アクセス・モード(IN、OUTおよびINOUT)を、外部プロシージャに対してパラメータで指定できます。
オプションのパラメータ名には、接頭辞としてコロン(:)が付きます。パラメータ名は外部ルーチン・パラメータ内で一意である必要があります。
データ型が必要であり、これはSQLデータ型またはドメイン名を使用するパラメータのタイプを示します。
パラメータは、LIST OF BYTE VARYINGデータ型としては宣言できません。
PARAMETER STYLE GENERAL
OpenVMSの引数を渡しファンクション値を返す表記規則と同様の方法で引数を渡し、値を返します。PROCEDURE
外部プロシージャ定義を作成します。このプロシージャはIN、OUTまたはINOUTパラメータのリストをオプションで受け入れ、CALL文において名前で参照されます。
RETURNS result-data-type
RETURNS domain-name
ファンクション(戻り)値について説明します。データ型と受渡しメカニズム(BY DESCRIPTOR、LENGTH、REFERENCEまたはVALUE)を指定できます。定義では、ファンクション値はOUTアクセス・モード値です。データ型が必要であり、これはSQLデータ型またはドメイン名を使用するパラメータのタイプを示します。
ファンクション値は、LIST OF BYTE VARYINGデータ型としては宣言できません。
STORED NAME IS identifier
マルチスキーマ・データベースに定義する際、ルーチンへのアクセスに使用される名前です。ストアド名を使用すると、1つのデータベース内では複数のスキーマを認識しないインタフェースを使用して、マルチスキーマ定義にアクセスできます。複数のスキーマに対応しないデータベース内では、ルーチンのストアド名は指定できません。ストアド名の詳細は、第2.2.18項を参照してください。USAGE IS
ファンクションまたはプロシージャのコール方法を指定します。
- USAGE IS GLOBALは、ファンクションまたはプロシージャが現在のモジュールの外部からコール可能であることを示します。これはデフォルトです。
- USAGE IS LOCALは、ルーチンの参照がモジュール内に限定されていることを示します。この句はCREATE MODULEには使用できますが、CREATE FUNCTIONまたはCREATE PROCEDUREには使用できません。
VARIANT
NOT VARIANT
これらの句は、DETERMINISTIC句およびNOT DETERMINISTIC句と同義です。DETERMINISTIC句は、ファンクションに対する入力が同じであれば、出力も同じになることを示します。これはNOT VARIANT句と同義です。NOT DETERMINISTIC句は、ファンクションの出力は、その入力に依存しないことを示します。これはVARIANT句と同義です。この句は廃止予定です。かわりにDETERMINISTICを使用してください。
- 外部ルーチンを作成するには、データベースに対するCREATEデータベース権限が必要です。
- 外部ファンクションは、WHERE句、SELECT文、INSERT文、COMPUTED BY句、ストアド・プロシージャ、絞込み条件定義、トリガー定義などにある、任意のSQL値式の引数から起動できます。
外部ファンクションのトリガーからの起動の詳細は、『Oracle Rdb7 Guide to Database Design and Definition』を参照してください。- 外部プロシージャは、複合文のCALL文を使用して起動できます。
- 外部ルーチンには、255までの引数が渡されます。
- VALUEで渡されるパラメータは、特定の言語では受け入れられません。
- FORTRANなどの特定の言語は、REFERENCEによるファンクション値の戻りを防止する構文によって制約されます。
- プロシージャ・パラメータ・アクセス・モードINOUTおよびOUTは、外部プロシージャのBY VALUE受渡しメカニズムと非互換です。
- ロケーション・ファイル仕様のデフォルトは最小限に抑えられています。デバイスおよびディレクトリは、ファイル仕様または論理名の一部として提供されていない場合、現在のデフォルト・デバイスおよびディレクトリに設定されます(SYS$DISK:[] SYS$DISKがデバイスのみを参照する場合、またはSYS$DISK: SYS$DISKがディレクトリを参照する検索リストの場合)。ファイル・タイプのデフォルトはありません。
- 外部ルーチンの実装に使用する言語は、指定のデータ型に限定される場合があります。追加情報は、言語固有のドキュメントを参照してください。
- 特定言語を指定すると、文字データ型のパラメータとファンクションの値についての、受渡しメカニズム・セマンティクスを変更できます。C言語によって、REFERENCEで渡される文字データ型がヌル文字で終了する文字列に渡されます。
- PARAMETER STYLE GENERAL句では、NULL値のある引数は使用できません。
- コメントのそれぞれの文字列リテラルの最大長は1024文字です。
- 外部ルーチンはデータベースにアタッチし、埋込みSQLなどにより、そのデータベースを使用するSQLデータ操作文を実行できます。
- 外部ルーチンでは、データ定義文は実行できません。
- 単一ルーチン・イメージは単一データベースで定義された複数ルーチン、またはアタッチされている複数データベースに登録されたルーチンから参照されます。
- 次の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。
- 外部ルーチンの作成
- アプリケーションからの外部ルーチンの起動
- パラメータおよび受渡しメカニズム
- ルーチンのアクティブ化および非アクティブ化
- 通知ルーチンの使用
- 実行環境
- 例外
- 制限事項
- 推奨事項
- 共通する問題および解決方法
- この文は読取り/書込みトランザクションで実行する必要があります。アクティブなトランザクションがない場合にこの文を発行すると、SQLでは、直近のDECLARE TRANSACTION文で指定された特性を持つトランザクションが開始されます。
- RDB$SYSTEM記憶域が読取り専用に設定されている場合、この文は実行できません。最初にRDB$SYSTEMを読取り/書込みに設定する必要があります。RDB$SYSTEM記憶域の詳細は、『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。
- ルーチン定義ごとに使用できるUSAGE IS句は1つのみです。外部ルーチンについては、句をルーチン・ヘッダーまたは外部ルーチン定義に使用できます。
- 同一データベースのコンテキストを複数のルーチンで共有する場合は、CREATE MODULE文でまとめて作成する必要があります。詳細は、「CREATE MODULE文」を参照してください。
- すべてのファンクションとプロシージャがUSAGE IS LOCALとして宣言されている場合、ルーチンはモジュールで実行できません。CREATE MODULE文は失敗します。
SQL> create module M cont> procedure p0 (in :a integer) cont> usage is local; cont> begin cont> trace 'p0: ', :a; cont> end; cont> end; cont> end module; %SQL-W-LOCALNEVER, Local routine "P0" is never called %SQL-F-MODALLLOCAL, Module "M" only contains local routines - invalid module
例1: 整数の絶対値ルーチンの提供
SQL> CREATE FUNCTION IABS (IN INTEGER BY REFERENCE) cont> RETURNS INTEGER BY VALUE; cont> EXTERNAL NAME MTH$JIABS cont> LOCATION 'SYS$SHARE:DPML$SHR.EXE' cont> LANGUAGE GENERAL cont> PARAMETER STYLE GENERAL cont> NOT DETERMINISTIC; SQL> -- SQL> SELECT IABS(-33) FROM JOBS LIMIT TO 1 ROW; 33 1 row selected
例2: DETERMINISTIC句ではなく、NOT DETERMINISTIC句の使用
次の例では、最初にCREATE FUNCTION文でDETERMINISTIC句を使用し、ファンクションを作成します。DETERMINISTIC句は、コールされる回数に関係なく、ファンクションが同じ結果を返すことを示します。引数は文字列リテラルであり、変更できないため、Oracle Rdbでは、ファンクション・コール全体を最適化し、後続のSELECT文でコールされないようにします。
SQL> -- Create a function with a DETERMINISTIC clause. SQL> CREATE function DO_COM (IN VARCHAR(255) BY DESCRIPTOR) cont> RETURNS INTEGER; cont> EXTERNAL NAME LIB$SPAWN cont> LOCATION 'SYS$SHARE:LIBRTL.EXE' cont> LANGUAGE GENERAL cont> PARAMETER STYLE GENERAL cont> DETERMINISTIC; SQL> -- SQL> -- Use a SELECT statement to pass a string literal to the function. SQL> -- SQL> -- Because Oracle Rdb optimizes functions with the DETERMINISTIC SQL> -- clause, and the function is passed a string literal, SQL> -- Oracle Rdb does not call the function from subsequent SQL> -- statements. SQL> -- SQL> SELECT DO_COM('WRITE SYS$OUTPUT "HELLO"'), employee_id FROM employees cont> LIMIT TO 5 ROWS; HELLO DO_COM EMPLOYEE_ID 1 00164 1 00165 1 00166 1 00167 1 00168 5 rows selected SQL> -- SQL> -- Use the NOT DETERMINISTIC clause to create the function: SQL> -- SQL> CREATE function DO_COM (IN VARCHAR(255) BY DESCRIPTOR) cont> RETURNS INTEGER; cont> EXTERNAL NAME lib$SPAWN cont> LOCATION 'SYS$SHARE:LIBRTL.EXE' cont> LANGUAGE GENERAL cont> PARAMETER STYLE GENERAL cont> NOT DETERMINISTIC; SQL> SELECT DO_COM('WRITE SYS$OUTPUT "HELLO"'), EMPLOYEE_ID FROM EMPLOYEES cont> LIMIT TO 5 ROWS; HELLO HELLO DO_COM EMPLOYEE_ID 1 00164 HELLO 1 00165 HELLO 1 00166 HELLO 1 00167 1 00168 5 rows selected
例3: 外部ファンクションおよび外部プロシージャ定義
この例では、次を示しています。
- 外部ファンクションおよび外部プロシージャ
- CLIENT SITEバインディングおよびSERVER SITEバインディング
- BIND SCOPE
- NOTIFYルーチンおよびイベント
- 埋込みSQLおよびSQLモジュール言語を使用したSQLコールバック
- コールバックの使用時に必要なSQL$PREオプション
- コールバックの使用時に必要なリンカー・オプション
この例では、MF_PERSONNELデータベースのEMPLOYEES表に新規の列を追加します。外部ルーチンは、新規の列をスペース、および様々な従業員名に対応するSOUNDEX値に設定するために使用されます。アプリケーション・レベル(この場合はSQL)とともに通知ルーチンを使用したトランザクション制御では、アプリケーションのアクションによる外部ルーチンのアクションへの影響を示します。
スペース充填は埋込みSQLを含む外部ファンクションCLEAR_SOUNDEX(C言語で記述)で実行されます。これはMF_PERSONNELデータベースの別のインスタンスをオープンし、非アクティブ化されるまで、そのインスタンスをオープンのままにします。
SOUNDEX name-settingは、通知ルーチン(FORTRANで記述)を使用した外部プロシージャ(FORTRANで記述)で実行されます。これはデータベースを接続し、トランザクションを制御します。すべてのデータベース操作はSQLモジュール言語ルーチンで実行されます。このプロシージャもMF_PERSONNELデータベースの別のインスタンスをオープンします。これはトランザクションの最後にルーチンを非アクティブ化すると、通知ルーチンによって切断されます。通知ルーチンによって実行される文を表示し、データベース操作の進捗を示します。
SQL> ATTACH 'FILENAME MF_PERSONNEL'; SQL> -- SQL> -- Add the new column SOUNDEX_NAME to the EMPLOYEES table. SQL> -- SQL> ALTER TABLE EMPLOYEES ADD SOUNDEX_NAME CHAR(4); SQL> -- SQL> -- Define the CLEAR_SOUNDEX function. SQL> -- SQL> CREATE FUNCTION CLEAR_SOUNDEX () cont> RETURNS INTEGER BY VALUE; cont> EXTERNAL NAME CLEAR_SOUNDEX cont> LOCATION 'CLEAR_SOUNDEX.EXE' cont> LANGUAGE C PARAMETER STYLE GENERAL NOT DETERMINISTIC cont> BIND ON SERVER SITE BIND SCOPE CONNECT; SQL> -- SQL> -- Define the ADD_SOUNDEX_NAME procedure. SQL> -- SQL> CREATE PROCEDURE ADD_SOUNDEX_NAME cont> (INOUT INTEGER BY REFERENCE); cont> EXTERNAL NAME ADD_SOUNDEX_NAME cont> LOCATION 'ADD_SOUNDEX.EXE' cont> LANGUAGE FORTRAN PARAMETER STYLE GENERAL cont> BIND ON CLIENT SITE BIND SCOPE TRANSACTION cont> NOTIFY ADD_SOUNDEX_NOTIFY ON BIND, TRANSACTION; SQL> -- SQL> COMMIT; SQL> DISCONNECT ALL; SQL> EXIT;
例4: C言語で記述したCLEAR_SOUNDEX.SCプログラム
/* Set the soundex_name column to spaces, return any error as function value */ static int state = 0; extern int clear_soundex () { exec sql include sqlca ; exec sql declare alias filename MF_PERSONNEL; if (state == 0) { exec sql attach 'filename MF_PERSONNEL'; state = 1; } exec sql set transaction read write; if (SQLCA.SQLCODE < 0) return SQLCA.SQLCODE; exec sql update employees set soundex_name = ' '; if (SQLCA.SQLCODE < 0) return SQLCA.SQLCODE; exec sql commit; if (SQLCA.SQLCODE < 0) return SQLCA.SQLCODE; return 0; }
例5: リンカー・オプション・ファイルのコンパイル、作成およびCLEAR_SOUNDEXプログラムへのリンク
$ SQL$PRE/CC/NOLIST/SQLOPT=ROLLBACK_ON_EXIT CLEAR_SOUNDEX.SC $ CREATE CLEAR_SOUNDEX.OPT SYMBOL_VECTOR = (CLEAR_SOUNDEX=PROCEDURE) PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR PSECT_ATTR=RDB$DBHANDLE,NOSHR PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR $ LINK/SHARE=CLEAR_SOUNDEX.EXE - CLEAR_SOUNDEX.OBJ, SQL$USER:/LIBRARY, - CLEAR_SOUNDEX.OPT/OPT SYMBOL_VECTOR = (CLEAR_SOUNDEX=PROCEDURE) PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR PSECT_ATTR=RDB$DBHANDLE,NOSHR PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR
例6: FORTRANで記述したADD_SOUNDEX.FORプログラム
C Set the soundex values, returning any error in the IN/OUT parameter SUBROUTINE ADD_SOUNDEX_NAME (ERROR) CHARACTER ID*5,LAST*14,SX_NAME*4 INTEGER ERROR ERROR = 0 ID = '00000' 10 CALL GET_NAME (ID, LAST, ERROR) IF (ERROR .NE. 0) GO TO 80 CALL MAKE_SOUNDEX_NAME (LAST, SX_NAME) CALL SET_SOUNDEX_NAME (ID, SX_NAME, ERROR) IF (ERROR .EQ. 0) GO TO 10 80 IF (ERROR .EQ. 100) ERROR = 0 90 RETURN END C Perform database connection and transaction operations for notify events SUBROUTINE ADD_SOUNDEX_NOTIFY (FUNC, RSV1, RSV2, RSV3) INTEGER FUNC, RSV1, RSV2, RSV3, SQLCODE SQLCODE = 0 GO TO (10,20,5,5,30,40,50),FUNC 5 TYPE *,'*** ADD_SOUNDEX_NOTIFY bad func ***' GO TO 90 10 TYPE *,'*** ADD_SOUNDEX_NOTIFY activate ***' CALL ATTACH_DB (SQLCODE) IF (SQLCODE .NE. 0) GO TO 80 GO TO 90 20 TYPE *,'*** ADD_SOUNDEX_NOTIFY deactivate ***' CALL DETACH_DB (SQLCODE) IF (SQLCODE .NE. 0) GO TO 80 GO TO 90 30 TYPE *,'*** ADD_SOUNDEX_NOTIFY start tran ***' CALL START_TRAN (SQLCODE) IF (SQLCODE .NE. 0) GO TO 80 GO TO 90 40 TYPE *,'*** ADD_SOUNDEX_NOTIFY commit tran ***' CALL COMMIT_TRAN (SQLCODE) IF (SQLCODE .NE. 0) GO TO 80 GO TO 90 50 TYPE *,'*** ADD_SOUNDEX_NOTIFY rollback tran ***' CALL ROLLBACK_TRAN (SQLCODE) IF (SQLCODE .NE. 0) GO TO 80 GO TO 90 80 CALL SQL_SIGNAL () 90 RETURN END C A 'substitute' SOUNDEX routine for demonstration purposes only SUBROUTINE MAKE_SOUNDEX_NAME (NAME, SOUNDEX_NAME) CHARACTER NAME*(*),SOUNDEX_NAME*4 SOUNDEX_NAME(1:1)=NAME(1:1) IV = ICHAR(NAME(1:1))+22 SOUNDEX_NAME(2:2)=CHAR(MOD(IV,10)+48) SOUNDEX_NAME(3:3)=CHAR(MOD(IV/10,10)+48) SOUNDEX_NAME(4:4)=CHAR(IV/100+48) RETURN END
例7: ADD_SOUNDEXM.SQLMODモジュール
-- Support for set soundex routine MODULE ADD_SOUNDEX LANGUAGE FORTRAN PARAMETER COLONS PROCEDURE ATTACH_DB (SQLCODE); ATTACH 'FILENAME MF_PERSONNEL'; PROCEDURE DETACH_DB (SQLCODE); DISCONNECT DEFAULT; PROCEDURE START_TRAN (SQLCODE); SET TRANSACTION READ WRITE; PROCEDURE COMMIT_TRAN (SQLCODE); COMMIT; PROCEDURE ROLLBACK_TRAN (SQLCODE); ROLLBACK; PROCEDURE GET_NAME (:ID CHAR(5), :LASTNAME CHAR(14), SQLCODE); SELECT EMPLOYEE_ID, LAST_NAME INTO :ID, :LASTNAME FROM EMPLOYEES WHERE EMPLOYEE_ID > :ID LIMIT TO 1 ROW; PROCEDURE SET_SOUNDEX_NAME (:ID CHAR(5), :SX_NAME CHAR(4), SQLCODE); UPDATE EMPLOYEES SET SOUNDEX_NAME = :SX_NAME WHERE EMPLOYEE_ID = :ID;
例8: リンカー・オプション・ファイルのコンパイル、作成およびFORTRANとSQLモジュール言語プログラムへのリンク
$ FORTRAN/NOLIST ADD_SOUNDEX.FOR $ SQL$MOD ADD_SOUNDEXM.SQLMOD $ CREATE ADD_SOUNDEX.OPT SYMBOL_VECTOR = (ADD_SOUNDEX_NAME=PROCEDURE) SYMBOL_VECTOR = (ADD_SOUNDEX_NOTIFY=PROCEDURE) PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR PSECT_ATTR=RDB$DBHANDLE,NOSHR PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR $ LINK/SHARE=ADD_SOUNDEX.EXE - ADD_SOUNDEX.OBJ, ADD_SOUNDEXM.OBJ, SQL$USER:/LIBRARY, - ADD_SOUNDEX.OPT/OPT SYMBOL_VECTOR = ADD_SOUNDEX_NAME SYMBOL_VECTOR = ADD_SOUNDEX_NOTIFY PSECT_ATTR=RDB$MESSAGE_VECTOR,NOSHR PSECT_ATTR=RDB$DBHANDLE,NOSHR PSECT_ATTR=RDB$TRANSACTION_HANDLE,NOSHR
例9: 対話型SQLでのルーチンの使用