• 検索結果がありません。

Oracle Database 11gにおけるRules Managerを使用したComplex Event Processing(CEP)のためのWebサービスの実装

N/A
N/A
Protected

Academic year: 2021

シェア "Oracle Database 11gにおけるRules Managerを使用したComplex Event Processing(CEP)のためのWebサービスの実装"

Copied!
18
0
0

読み込み中.... (全文を見る)

全文

(1)

Oracle Database 11g に お け る Rules

Manager を 使 用 し た Complex Event

Processing(CEP)のための Web サービ

スの実装

Oracle ホワイト・ペーパー

2007 年 6 月

(2)

Oracle Database 11g における Rules Manager を

使用した Complex Event Processing(CEP)のための

Web サービスの実装

はじめに

イベントの複雑なパターンは、アプリケーションと時間を跨いで発生する例外、

脅威、または機会を表しています。ビジネスでは、これらのパターンを識別し、

自動的に対応する必要があります。Complex Event Processing(CEP)には、イベン

ト・パターンをモデル化し、イベント履歴をフィルタリング、集計、および格納

する機能が必要になります。CEP により利点がもたらされるアプリケーションに

は、EPC/RFID、不正、リスク、コンプライアンス、CRM、組み合わせ販売、デー

タのフィルタリング/変換、セマンティック Web ドメイン・ノード通信といったも

のがあります。

Oracle Database 11g の Rules Manager 機能は、

複合イベントを介した Complex Event

Processing を提供します。複合イベントは、時間とアプリケーションに分散された

複数のプリミティブ・イベントで構成されます。Rules Manager には、豊富なデー

タ型、強力なルール・セマンティック、マルチテラバイトのデータセット、イベ

ントの動作を支配するポリシーのサポートが含まれます。CEP パターンをモデリ

ングするルールは、分散されたイベント駆動型のサービス指向アーキテクチャ

(SOA)コンポーネントをオーケストレーションするために使用できます。SOA ベー

スのアプリケーションでは、多くの場合、これらのオーケストレーション・ルー

ルを使用して、情報の流れ方とサービスの動作を制御し、プロセス・ベースの複

合アプリケーションを動的に作成します。Rules Manager で構築された Web サー

ビスは、SOA アプリケーションを使用して、それらのオーケストレーション・ルー

ルを Oracle Database で管理し、ルールを別のサービスとしてモデル化できます。

(3)

概要

Oracle Database 11g は、PL/SQL パッケージ、プロシージャ、およびファンクショ

ンを使用した、Rules Manager 操作のための Web サービスの作成をサポートして

います。Web サービスは、イベントを受け取る Rules Manager のランタイム操作

と、ルールによりイベントが true と判定された場合に起動されるルール・アクショ

ンのために作成できます。イベントを受け取る Web サービスは、Oracle Database

で実行されるルール・アクションを起動したり、(アクションの実行といった)

後処理を行うアプリケーションに true と判定されたルールのリストを返したりで

きます。このドキュメントでは、Rules Manager のランタイム Web サービスを実

装するための手順とサンプル・コードの概要について説明します。

イベント構造、ルール・クラス、およびルールを作成するための Rules Manager

の管理操作は、Web サービスとして外部アプリケーションに公開することもでき

ます。ただし、管理操作の大部分は反復が必要な手順を伴うので、ユーザー・イ

ンタフェース・ツール(EM Grid Control と Oracle JDeveloper に同梱されているツー

ルなど)を使用すると最適なモデル化を実現できます。

利用者の前提条件

• データベースで Rules Manager アプリケーションを作成および管理するた

めの実用的な知識。『Application Developer's Guide - Rules Manager and

Expression Filter, Oracle Database, Release 10.2』を参照してください。

• PL/SQL Web サービスの作成方法に関する実用的な知識。この点について

は、『Oracle Application Server Web Services Developer's Guide 10g Release 3

(10.1.3)』の"Exposing PL/SQL Packages as Web Services"を参照してくだ

さい。このドキュメントに記載されているサンプル・コードは、Oracle

Containers for J2EE(OC4J)、10g Release 3(10.1.3)でテスト済みです。

• PL/SQL の実装から Web サービスを起動するための実用的な知識。この

点については、次のアドレスにある『Calling Web Services from PL/SQL in

the Oracle9i Database』を参照してください。

http://www.oracle.com/technology/tech/webservices/htdocs/samples/dbw ebservice/

DBWebServices_PLSQL.html

Web サービスを使用した Rules Manager イベントの受信

一連のルールを備えたルール・クラスを Oracle Database スキーマ内に作成すると、

それらのルールは、一定の期間内に受信したイベントに対して判定されます。こ

こでは、これらのイベント・インスタンスを受信する Web サービスの作成手順に

ついて説明します。

これらの手順を示すために使用するサンプル・アプリケーションは、『Application

Developer's Guide - Rules Manager and Expression Filter, Release 10.2』

の第 9.1 項"Law

Enforcement Rules Application"で説明されているものと同じです。

(4)

2.

ルール・クラスのイベントを受け入れるための Web サービス・インタ

フェースとして機能する、PL/SQL パッケージを作成します。通常、この

パッケージは、それぞれの属性のタイプを使用して各プリミティブ・イ

ベントを受け入れるための機能を備えています。ルール・クラスでは、

イベントのルールを 2 つのモード(アクションをデータベースで実行す

るモード、結果と一致するルールをアプリケーションに返すモード)で

判定できるため、ファンクションは両方のモードで機能するように作成

できます。たとえば、次のパッケージは、手順 1 で作成した Law Enforcement

ルール・クラスの Web サービス PL/SQL インタフェースとして機能させ

ることが可能です。

PACKAGE LawEnfInf as FUNCTION BankTransaction ( SubjectId NUMBER, TranType VARCHAR2, Amount NUMBER, FundFrom VARCHAR2, rlm$getmatches BOOLEAN) RETURN sys.XmlType; FUNCTION Transportation ( SubjectId NUMBER, VesselType VARCHAR2, LocFrom VARCHAR2, LocTo VARCHAR2, StartDate DATE, EndDate DATE, rlm$getmatches BOOLEAN) RETURN sys.XmlType; FUNCTION FieldReport ( SubjectId NUMBER, RptType VARCHAR2, WhoWith NUMBER, RptOrd VARCHAR2, RptReg VARCHAR2, RpyBody SYS.XMLTYPE, rlm$getmatches BOOLEAN) RETURN sys.XmlType; END;

このパッケージは、適切な名前のファンクションを備えた各タイプのプ

リミティブ・イベントを受け入れるように作成されています。ファンク

ション・パラメータは、対応するプリミティブ・イベントの属性を受け

入れるように定義されています。たとえば、LawEnfInf パッケージの

BankTransaction ファンクションは、LawEnforcementRC ルール・クラスで

設定されている BankTransaction プリミティブ・イベント型のすべての属

性の値を受け入れます。さらに、各ファンクションには一致するルール

のアクション実行を制御するための rlm$getmatches パラメータがありま

す。rlm$getmatches パラメータが true に設定されている場合、ルール・ア

プリケーションはデータベースでのアクションの実行をスキップし、

ルールの処理結果が XML ドキュメントとして返されます。このパラメー

タを false に設定した場合、一致するルールのアクションがデータベース

で実行されます(アクション・コールバック・メカニズムを使用)。

LawEnfInf パッケージの実装については、付録 A を参照してください。

任意のルール・クラスに対して上述の PL/SQL パッケージを自動生成する

方法については、付録 B を参照してください。

3.

手順 2 で作成した PL/SQL パッケージを所有するデータベース・スキー

マに接続するために、OC4J インストールに適切なデータソース定義を設

(5)

定します(<oc4j_home>/j2ee/config/data-sources.xml の説明に従ってくださ

い)。新しいデータソース定義を利用するために、OC4J インスタンスを

再起動します。

4.

手順 2 で作成した PL/SQL パッケージを Web サービスとして公開します。

次の 3 つのコマンドを入力して、指定したオプションで Web サービスを

公開し、その Web サービスを配置名 lawenf で配置します。次に、lawenf

Web サービスをパスが/ruldemo の Web サイトにバインドします。これら

のコマンドは、OC4J_HOME 環境変数が、スタンドアロン OC4J がインス

トールされているディレクトリを指しており、oc4jadmin ユーザーのパス

ワードが welcome であることを想定しています。

java -jar $OC4J_HOME/webservices/lib/wsa.jar -plsqlAssemble ¥ -appName lawenf -sql lawenfinf -dataSource jdbc/OracleDS ¥ -dbConnection jdbc:oracle:thin:@stacm34:1521:rlm6 ¥ -dbUser ruldemo/ruldemo -style rpc -use encoded java -jar $OC4J_HOME/j2ee/home/admin.jar ormi://localhost

¥ oc4jadmin welcome -deploy -file ./lawenf.ear ¥ -deploymentName lawenf

java -jar $OC4J_HOME/j2ee/home/admin.jar ormi://localhost ¥ oc4jadmin welcome -bindWebApp lawenf lawenf-web ¥ default-web-site /ruldemo

5.

新たに配置した Web サービスを起動します。Web サービスは、Web サイ

トのパスと配置名を使用してアクセスできます。次を参照してください。

これは、OC4J サーバーが localhost のポート 8888 で稼動していると想定

しています。

(6)

lawenf Web サービスのエンド・ポイントでは、基礎となるルール・クラ

スに関連づけられている各タイプのプリミティブ・イベントを処理する

ための操作を 1 つ定義します。Web サービスのサービス定義(WSDL 記

述)は、Service Description リンクをクリックすることで取得できます。

6. Web サービスをテストします。Web サービスのテストは、バンク・トラ

ンザクションのプリミティブ・イベントのルールを処理し、結果を SOAP

レスポンスとして受信しておこないます。前述のページでバンク・トラ

ンザクションの操作をクリックして、バンク・トランザクションに関係

する値を入力します。

(7)

Preview SOAP に従って処理を進め、データベースで LawEnforcementRC ルール・

クラスにあるルールを処理するための操作を起動します。Web サービス・リクエ

ストの SOAP ボディと対応するレスポンスは次のとおりです。

リクエスト

<soap:Body soap:encodingStyle= mas.xmlsoap.org/soap/encoding/"> "http://sche <ns:banktransaction> <subjectid xsi:type="xsd:decimal">123302122 </subjectid> <trantype xsi:type="xsd:string">TRANSFER</trantype> <amount xsi:type="xsd:decimal">1000000</amount> <fundfrom xsi:type="xsd:string">USSR</fundfrom> <rlmGetmatches xsi:type="soapenc:boolean">true </rlmGetmatches> </ns:banktransaction> </soap:Body>

レスポンス

(8)

<ROWSET> <ROW> <MATCHEDRULE>1</MATCHEDRULE> </ROW> <ROW> <MATCHEDRULE>3</MATCHEDRULE> </ROW> </ROWSET>

上述の Web サービスから返される結果の内容は、パッケージの実装によって制御

されます。上述の結果は、付録 A に一覧表示されている LawEnfInf パッケージの

デフォルトの実装のものです。LawEnfInf パッケージの getMatches ファンクショ

ンの実装は変更し、上述の SOAP レスポンスにルール・アクションのプリファレ

ンス値を含めることができます。Web サービス・インタフェース・パッケージの

デフォルトの実装は、付録 B に一覧表示されているユーティリティ・パッケージ

を使用して生成されています。ユーティリティを使用して、任意の Oracle Database

スキーマの任意のルール・クラスに対する PL/SQL Web サービス・インタフェー

スを生成できます。このパッケージは、PUBLIC に対する EXECUTE 権限がある

EXFSYS スキーマにインストールされています。次のコマンドを実行すると、

LawEnforcementRC ルール・クラスを所有するスキーマに LawEnfInf パッケージ

(手

順 2 を参照)が作成されます。

begin exfsys.dbms_rlmgr_utlx.create_wsinterface( rule_class => ”LawEnforcementRC‘, interface_nm => ”LawEnfInf‘); end;

Web サービスとしてのルール・アクションの実装

Oracle Database に作成したルール・クラスは、1 つまたは複数のアクション・プリ

ファレンスを指定して設定できます。これらのアクション・プリファレンスは、

適切なアクションを実行するために、ルール・クラスのアクション・コールバッ

ク・プロシージャによって使用されます。ルール・アクションがデータベースの

外部で Web サービスとして実装されている場合、アクション・コールバック・プ

ロシージャを実装して、適切な SOAP メッセージをこれらの Web サービスのエン

ド・ポイントにポストできます。

各ルールに関連づけられているアクション・プリファレンスは、適切なバインド

変数を設定した SOAP ボディ、および Web サービスのロケーションを示す URL

を格納できます。たとえば、LawEnforcementRC ルール・クラス(『Application

Developer's Guide』の第 9.1 項を参照)には、次のアクション・プリファレンス指

定を使用して、(スクリプトで使用される actionType および actionParam プリファ

レンスの代わりか、またはこれらに加えて)2 つのアクション・プリファレンス

列を設定できます。

actionHTTPHandler VARCHAR2(200), actionWSLoc VARCHAR2(200),

actionSoap sys.XMLType

上述の指定を使用して作成したルール・クラス表の 3 つの列には、HTTP リクエ

スト・ハンドラ、Web サービスのロケーション、SOAP メッセージのスケルトン

がそれぞれ格納されます。SOAP メッセージ・スケルトンは、それにバインドさ

れる値のバインド変数を利用できます。たとえば、http://nypd.gov/webservices/

addtowatchlist にある NYPD Watch リストに人を追加する Web サービスの場合、こ

の URL は対応する actionWSLoc 列に格納され、この Web サービスの HTTP リク

エスト・ハンドラは actionHTTPHandler 列に格納されます。

(9)

この Web サービスに対して仮定の指定を使用すると、actionSoap に格納される

SOAP スケルトンは次のようになります。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <AddToWatchList xmlns="http://nypd.gov/webservices" SOAP-ENV:encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/"> <bindSubjectId/> </AddToWatchList> </SOAP-ENV:Body> </SOAP-ENV:Envelope>

このモデルで、前述の bindSubjectId 要素への参照は、ルールと一致するイベント・

インスタンスの SubjectId の情報で置き換えられます。この目的のために、アクショ

ン・コールバック・プロシージャを実装して、次の手順を実行できます。

1.

ルールと一致するイベント・インスタンスに基づき SOAP メッセージを作成

し ま す 。 こ の 例 で は 、 SOAP メ ッ セ ー ジ の 要 素 bindSubjectId が 、

BankTransaction イベント・インスタンスから取得したサブジェクト識別

子を含む SubjectId 要素で置き換えられます。

soapMsg = rlm$rule.actionSoap.insertXMLBefore( '//bindSubjectId', xmltype('<SubjectId>'|| bank.subjectId||'</SubjectId>')); soapMsg =soapMsg.deleteXML('//bindSubjectId');

これは、Oracle Database に SOAP メッセージ(または XML ドキュメント)を

作成するための数多くあるアプローチの 1 つにすぎません。アクション・コー

ルバック・プロシージャを使用してアクション・プリファレンスに XML ド

キュメントの一部を格納するそのほかのアプローチでは、XQuery を使用して

オンザフライで SOAP メッセージを作成します。

2.

ルール・クラスの actionWSLoc 列および actionHTTPHandler 列から取得した

Web サービスのロケーションに、HTTP を介してリクエストを送信します。

これには、Oracle データベースに付属している UTL_HTTP ユーティリティを

使用します。

http_req := utl_http.begin_request(rlm$rule.actionHTTPHandler, 'POST','HTTP/1.0'); utl_http.set_header(http_req, 'Content-Type', 'text/xml'); utl_http.set_header(http_req, 'Content-Length', length(soapMsg)); utl_http.set_header(http_req, 'SOAPAction', rlm$rule.actionWSLoc); utl_http.write_text(http_req, env); http_resp := utl_http.get_response(http_req); utl_http.read_text(http_resp, soapMsg); utl_http.end_response(http_resp);

(10)

結論

ビジネスでは、アプリケーションと時間を跨って発生する例外、脅威、または機

会を表す複雑なイベントのパターンを識別する必要があります。Complex Event

Processing には、イベント・パターンをモデル化し、イベント履歴をフィルタリン

グ、集計、および格納する機能が必要になります。CEP により利点がもたらされ

るアプリケーションには、EPC/RFID、不正、リスク、コンプライアンス、CRM、

抱合せ販売、データのフィルタリング/変換、セマンティック Web ドメイン・ノー

ド通信といったものがあります。

Oracle Database 11g の Rules Manager 機能によって、複雑なイベント・パターンに

対する Complex Event Processing で、スケーラビリティ、管理性、および高パフォー

マンスが実現します。SOA ベースのアプリケーションは、Rules Manager を使用し

て情報の流れをオーケストレーションできます。また、サービスの動作を制御し

て Oracle Database でプロセス・ベースの複合アプリケーションを動的に作成し、

ルールを別のサービスとしてモデル化できます。

(11)

付録 A:LawEnfInf パッケージの実装

PACKAGE BODY "LAWENFINF" as

--function determining the contents of the results returned – FUNCTION getMatches return sys.XMLType is

retv CLOB; BEGIN

select dbms_xmlgen.getxml('select rlm$ruleid as MatchedRule from MATCHEDCRITERIA') into retv from dual;

return xmltype(retv); END getMatches; FUNCTION BankTransaction ( SubjectId NUMBER, TranType VARCHAR2, Amount NUMBER, FundFrom VARCHAR2, rlm$getmatches BOOLEAN) RETURN sys.XmlType is rlm$eventi "RULDEMO"."BANKTRANSACTION" :=

"RULDEMO"."BANKTRANSACTION"(SUBJECTID, TRANTYPE, AMOUNT, FUNDFROM,

SYSTIMESTAMP); BEGIN IF (not(rlm$getmatches)) THEN

"RULDEMO".RLM$RULECLS_PACK_59668.exec_rules(sys.AnyData.convertObject (r lm$eventi)); return xmltype('<empty/>'); ELSE "RULDEMO".RLM$RULECLS_PACK_59668.add_event(sys.AnyData.convertObject (rl m$eventi)); return getMatches(); END IF; END; FUNCTION Transportation ( SubjectId NUMBER, VesselType VARCHAR2, LocFrom VARCHAR2, LocTo VARCHAR2, StartDate DATE, EndDate DATE, rlm$getmatches BOOLEAN) RETURN sys.XmlType is rlm$eventi "RULDEMO"."TRANSPORTATION" :=

"RULDEMO"."TRANSPORTATION"(SUBJECTID, VESSELTYPE, LOCFROM, LOCTO, STARTDATE, ENDDATE, SYSTIMESTAMP); BEGIN IF (not(rlm$getmatches)) THEN "RULDEMO".RLM$RULECLS_PACK_59668.exec_rules(sys.AnyData.convertObject (r lm$eventi)); return xmltype('<empty/>'); ELSE "RULDEMO".RLM$RULECLS_PACK_59668.add_event(sys.AnyData.convertObject (rl m$eventi)); return getMatches(); END IF; END; FUNCTION FieldReport (

(12)

RpyBody SYS.XMLTYPE, rlm$getmatches BOOLEAN)

RETURN sys.XmlType is rlm$eventi "RULDEMO"."FIELDREPORT" :=

"RULDEMO"."FIELDREPORT"(SUBJECTID, RPTTYPE, WHOWITH, RPTORG, RPTREG, RPTBODY, SYSTIMESTAMP); BEGIN IF (not(rlm$getmatches)) THEN "RULDEMO".RLM$RULECLS_PACK_59668.exec_rules(sys.AnyData.convertObject (r lm$eventi)); return xmltype('<empty/>'); ELSE "RULDEMO".RLM$RULECLS_PACK_59668.add_event(sys.AnyData.convertObjec t(rl m$eventi)); return getMatches(); END IF; END; END;

付録B:ルール・クラスのWebサービスPL/SQLインタフェースを生

成するためのパッケージ

/* Installation Instructions:

Run this script while connects as sysdba. Usage : begin exfsys.dbms_rlmgr_utlx.create_wsinterface( rule_class => ”LawEnforcementRC‘, interface_nm => ”LawEnfInf‘); end; Description:

Given a rule class name and the name of the PL/SQL interface to be created, the create_wsinterface procedure creates the PL/SQL interface in the same schema as the rule class. The PL/SQL interface

for the rule class has functions to receive each primitive event type

from a web service and either return the results or execute the actions for the matching rules.

*/

---Extension to UTL package.

create or replace package exfsys.dbms_rlmgr_utlx authid current_user as

/***************************************************************** *Procedure to create a package for web services. This acts as the * *PL/SQL interface for the web service end points * * rule_class -name of the rule class in the current schema * * interface_nm -name of the interface. This name is used in the * * web service configuration file. * *****************************************************************/ procedure create_wsinterface ( rule_class IN VARCHAR2, interface_nm IN VARCHAR2); end dbms_rlmgr_utlx; /

create or replace package body exfsys.dbms_rlmgr_utlx is

procedure pvt_get_arglist_attrlst (

asowner IN VARCHAR2, asname IN VARCHAR2,

(13)

arglist IN OUT VARCHAR2, attrlist IN OUT VARCHAR2) is comma VARCHAR2(2) := '';

dtype VARCHAR2(32);

CURSOR attrlst (asowner VARCHAR2, asname VARCHAR2) is

--already order by attribute id -select attribute, data_type from all_expfil_attributes where owner = asowner and attribute_set_name = asname;

begin

arglist := ''; attrlist := '';

for c1 in attrlst (asowner, asname) loop dtype := c1.data_type;

if (instr(dtype,')',-1,1) = length(dtype)) then --last char is a ')' –

dtype := substr(dtype,1,instr(dtype,'(',-1,1)-1); end if;

if (c1.attribute = 'RLM$CRTTIME') then

attrlist := attrlist||comma||' SYSTIMESTAMP'; else

arglist := arglist||comma||c1.attribute||' '||dtype; attrlist := attrlist||comma||c1.attribute; end if; comma := ', '; end loop; end; procedure copy_into_stmtset(

stmtset IN OUT NOCOPY dbms_sql.varchar2s, idx IN OUT NUMBER,

tocopy IN VARCHAR2, breakat IN CHAR) is tmpbuf VARCHAR2(16000) := tocopy; pos NUMBER;

begin

if (length(tmpbuf) = 0) then return;

elsif (length(tmpbuf) < 100) then stmtset(idx) := ' '||tmpbuf; idx := idx+1;

return; end if;

--tmpbuf has over 200 characters - while (true) loop

pos := instr(tmpbuf,breakat,80); if (pos > 0) then

stmtset(idx) := ' '||substr(tmpbuf,1,pos); idx := idx+1;

tmpbuf := substr(tmpbuf, pos+1); else

---copy the last piece over – stmtset(idx) := ' '||tmpbuf; idx := idx+1; return; end if; end loop; end copy_into_stmtset; procedure pvt_create_wsinterface ( schnm IN VARCHAR2, rclsnm IN VARCHAR2, infname IN VARCHAR2) is is_comp VARCHAR2(3); rspcknm VARCHAR2(32);

(14)

';

stmtset dbms_sql.varchar2s; idx number := 1; dbsqcr integer;

CURSOR distprmevts (rclsown VARCHAR2, rclsnm VARCHAR2) is select distinct prim_event_struct from

all_rlmgr_comprcls_properties where rule_class_owner = rclsown and rule_class_name = rclsnm;

begin begin

select event_structure, is_composite, rule_class_pack, rcls_rslt_view

into evtst, is_comp, rspcknm, rsltview from all_rlmgr_rule_classes ar

where ar.rule_class_owner = schnm and ar.rule_class_name = rclsnm;

exception

when no_data_found then

dbms_rlmgr_dr.raise_error(41608); end;

frspknm := '"'||schnm||'".'||rspcknm;

--Web service interface is not supported when the event struct --has atleast one table alias attributes. –

select count(*) into dumnum from all_expfil_attributes where owner = schnm and attribute_set_name = evtst and

associated_table is not null; if (dumnum > 0) then

dbms_rlmgr_dr.raise_error(41633, 'web services with table alises');

end if;

if (is_comp = 'NO') then

--create package specification – idx := 1;

dbsqcr := dbms_sql.open_cursor;

stmtset(idx) :=

'CREATE PACKAGE "'||infname||'" as '||nl|| --case insensitive event struct name – ' FUNCTION '||evtst||' (';

idx := idx+1;

pvt_get_arglist_attrlst (schnm, evtst, arglst, attrlst); --copy argument list -copy_into_stmtset (stmtset, idx, arglst, ','); stmtset(idx) :=

' , rlm$getmatches BOOLEAN) '|| 'RETURN sys.xmltype; '||nl|| 'END;';

dbms_sql.parse(dbsqcr, stmtset, stmtset.FIRST, stmtset.LAST, TRUE,

dbms_sql.native); idx := dbms_sql.execute(dbsqcr); dbms_sql.close_cursor(dbsqcr);

--create package body – idx := 1;

dbsqcr := dbms_sql.open_cursor; stmtset(idx) :=

'CREATE PACKAGE BODY "'||infname||'" as '||nl|| ' FUNCTION getMatches return sys.XMLType is '||nl|| ' retv CLOB;'||nl||

' BEGIN '; idx := idx+1; stmtset(idx) :=

' select dbms_xmlgen.getxml(''select rlm$ruleid as MatchedRule

' ||nl||' from '||rsltview||''') into retv from dual;'; idx := idx+1;

stmtset(idx) :=

' if (retv is null) then return xmltype(''<empty/>''); else '||nl||

(15)

' return xmltype(retv); end if;'; idx := idx+1; stmtset(idx) := ' END getMatches; '||nl|| ' FUNCTION '||evtst||' ('; idx := idx+1;

--copy argument list –

copy_into_stmtset (stmtset, idx, arglst, ','); stmtset(idx) := ' , rlm$getmatches BOOLEAN) '|| 'RETURN sys.xmltype is '||nl|| ' rlm$eventi "'||schnm||'"."'||evtst||'" := "'||schnm|| '"."'||evtst||'"( '; idx := idx+1;

copy_into_stmtset (stmtset, idx, attrlst, ',');

stmtset(idx) := ' );'||nl|| ' BEGIN '||nl|| ' IF (not(rlm$getmatches)) THEN '; idx := idx+1; stmtset(idx) := ' '||frspknm|| '.exec_rules(sys.AnyData.convertObject(rlm$eventi));'||nl|| ' return xmltype(''<empty/>'');'||nl|| --eval complete – ' ELSE '; --add_event model –

idx := idx+1;

--if required, we need to reset session – stmtset(idx) := ' '||frspknm||'.RESET_SESSION;'; idx := idx+1; stmtset(idx) := ' '||frspknm|| '.add_event(sys.AnyData.convertObject(rlm$eventi));'||nl|| ' return getMatches();'; idx := idx+1; stmtset(idx) := ' END IF;'||nl|| ' END;'||nl|| 'END;';

dbms_sql.parse(dbsqcr, stmtset, stmtset.FIRST, stmtset.LAST, TRUE,

dbms_sql.native); idx := dbms_sql.execute(dbsqcr); dbms_sql.close_cursor(dbsqcr); else

--create package specification – idx := 1;

dbsqcr := dbms_sql.open_cursor;

stmtset(idx) :=

'CREATE PACKAGE "'||infname||'" as '; idx := idx+1;

--for each of the unique primitive event type - for c1 in distprmevts (schnm, rclsnm) loop

stmtset(idx) :=

' FUNCTION '||c1.prim_event_struct||' ('; idx := idx+1;

pvt_get_arglist_attrlst (schnm, c1.prim_event_struct, arglst, attrlst);

--copy argument list –

copy_into_stmtset (stmtset, idx, arglst, ','); stmtset(idx) :=

(16)

dbms_sql.parse(dbsqcr, stmtset, stmtset.FIRST, stmtset.LAST, TRUE,

dbms_sql.native); idx := dbms_sql.execute(dbsqcr); dbms_sql.close_cursor(dbsqcr);

--create package body - idx := 1;

dbsqcr := dbms_sql.open_cursor; stmtset(idx) :=

'CREATE PACKAGE BODY "'||infname||'" as '||nl|| ' FUNCTION getMatches return sys.XMLType is '||nl|| ' retv CLOB;'||nl||

' BEGIN '; idx := idx+1; stmtset(idx) :=

' select dbms_xmlgen.getxml(''select rlm$ruleid as MatchedRule '

||nl||' from '||rsltview||''') into retv from dual;'; idx := idx+1;

stmtset(idx) :=

' if (retv is null) then return xmltype(''<empty/>''); else '||nl||

' return xmltype(retv); end if;'; idx := idx+1;

stmtset(idx) := ' END getMatches; '; idx := idx+1;

--for each of the unique primitive event type - for c1 in distprmevts (schnm, rclsnm) loop

stmtset(idx) :=

' FUNCTION '||c1.prim_event_struct||' ('; idx := idx+1;

pvt_get_arglist_attrlst (schnm, c1.prim_event_struct, arglst, attrlst);

--copy argument list -

copy_into_stmtset (stmtset, idx, arglst, ','); stmtset(idx) := ' , rlm$getmatches BOOLEAN) '|| 'RETURN sys.xmltype is '; idx := idx+1; stmtset(idx) := ' rlm$eventi "'||schnm||'"."'||c1.prim_event_struct|| '" := "'||schnm||'"."'||c1.prim_event_struct||'"( '; idx := idx+1;

copy_into_stmtset (stmtset, idx, attrlst, ','); stmtset(idx) := ' );'||nl|| ' BEGIN '||nl|| ' IF (not(rlm$getmatches)) THEN '; idx := idx+1; stmtset(idx) := ' '||frspknm|| '.exec_rules(sys.AnyData.convertObject(rlm$eventi)); '||nl||

' return xmltype(''<empty/>'');'||nl|| --eval complete - ' ELSE '; --add_event model -

idx := idx+1;

--if required, we need to reset session - stmtset(idx) := ' '||frspknm||'.RESET_SESSION;'; idx := idx+1; stmtset(idx) := ' '||frspknm|| '.add_event(sys.AnyData.convertObject(rlm$eventi));'||nl|| ' return getMatches();'; idx := idx+1; stmtset(idx) := ' END IF;'||nl|| ' END;'; idx := idx+1; end loop; stmtset(idx) :=

(17)

'END;';

dbms_sql.parse(dbsqcr, stmtset, stmtset.FIRST, stmtset.LAST, TRUE,

dbms_sql.native); idx := dbms_sql.execute(dbsqcr); dbms_sql.close_cursor(dbsqcr); end if;

select status into dumvarc from all_objects where owner = schnm and object_name = infname and object_type = 'PACKAGE BODY'; if (dumvarc != 'VALID') then

-- EXECUTE IMMEDIATE 'drop package "'||infname||'"'; dbms_rlmgr_dr.raise_error(38500,

'web service interface creation failed'); end if; end pvt_create_wsinterface; procedure create_wsinterface ( rule_class IN VARCHAR2, interface_nm IN VARCHAR2) is schnm VARCHAR2(32); rsetnm VARCHAR2(32); intrfc VARCHAR2(32); begin dbms_rlmgr_ir.get_object_owner_n_name(rule_class, schnm, rsetnm); if (schnm is null or length(schnm) = 0) then

schnm := sys_context('USERENV', 'CURRENT_USER'); end if;

if (schnm != sys_context('USERENV', 'CURRENT_USER')) then dbms_rlmgr_dr.raise_error(41605, rule_class);

end if;

dbms_rlmgr_ir.get_object_owner_n_name(interface_nm, schnm, intrfc); if (schnm is null or length(schnm) = 0) then

schnm := sys_context('USERENV', 'CURRENT_USER'); end if;

if (schnm != sys_context('USERENV', 'CURRENT_USER')) then dbms_rlmgr_dr.raise_error(41605, interface_nm); end if;

pvt_create_wsinterface (schnm, rsetnm, intrfc); end create_wsinterface;

end; /

show errors;

(18)

Oracle Database 11g における Rules Manager を使用した Complex Event Processing(CEP)のための Web サービスの実装 2007 年 6 月 著者:Aravind Yalamanchi Oracle Corporation World Headquarters 500 Oracle Parkway Redwood Shores, CA 94065 U.S.A. 海外からのお問い合わせ窓口: 電話:+1.650.506.7000 ファクシミリ:+1.650.506.7200 www.oracle.com

Copyright © 2007, Oracle. All rights reserved.

本文書は情報提供のみを目的として提供されており、ここに記載される内容 は予告なく変更されることがあります。本文書は一切間違いがないことを保 証するものではなく、さらに、口述による明示または法律による黙示を問わ ず、特定の目的に対する商品性もしくは適合性についての黙示的な保証を含 み、いかなる他の保証や条件も提供するものではありません。オラクル社は 本文書に関するいかなる法的責任も明確に否認し、本文書によって直接的ま たは間接的に確立される契約義務はないものとします。本文書はオラクル社 の書面による許可を前もって得ることなく、いかなる目的のためにも、電子 または印刷を含むいかなる形式や手段によっても再作成または送信すること はできません。Oracle、JD Edwards、PeopleSoft、および Siebel は、米国 Oracle Corporation およびその子会社、関連会社の登録商標です。その他の名 称はそれぞれの会社の商標です。

参照

関連したドキュメント

このように、このWの姿を捉えることを通して、「子どもが生き、自ら願いを形成し実現しよう

えて リア 会を設 したのです そして、 リア で 会を開 して、そこに 者を 込 ような仕 けをしました そして 会を必 開 して、オブザーバーにも必 の けをし ます

燃料取り出しを安全・着実に進めるための準備・作業に取り組んでいます。 【燃料取り出しに向けての主な作業】

すべての Web ページで HTTPS でのアクセスを提供することが必要である。サーバー証 明書を使った HTTPS

層の項目 MaaS 提供にあたっての目的 データ連携を行う上でのルール MaaS に関連するプレイヤー ビジネスとしての MaaS MaaS

脅威検出 悪意のある操作や不正な動作を継続的にモニタリングす る脅威検出サービスを導入しています。アカウント侵害の

基準の電力は,原則として次のいずれかを基準として決定するも

を育成することを使命としており、その実現に向けて、すべての学生が卒業時に学部の区別なく共通に