識別コード・パッケージは、電子製品コード(EPC)などOracle Databaseの各種製品コードや識別コード間の格納、取出し、エンコード、デコード、および翻訳を行うツールや手法を提供する、Oracle Databaseの機能です。また、データ型、メタデータ表およびビュー、およびEPC標準RFIDタグまたは新型RFIDタグをユーザー表に格納するためのPL/SQLパッケージも提供します。
識別コード・パッケージによって、Oracle Databaseは、EPCコード体系の認識、効率的な記憶域およびコンポーネント・レベルのEPCデータの取得、EPCglobal Tag Data Translation 1.0(TDT)標準に準拠することが可能になります。TDT標準は、各種EPC RFIDタグ表現間のデコード、エンコード、および翻訳の方法について定義したものです。
このパッケージはまた、EPC標準には含まれていない既存のコード体系をアプリケーションで使用するための拡張可能なフレームワークを提供します。このフレームワークにより、Oracle Databaseは古いシステムにも、今後EPC標準に含まれる可能性のある、進化する識別コードにも対応可能となります。
また、識別コード・パッケージでは、最初にエンコード・カテゴリを登録してエンコード・タイプを登録し、次にエンコード・タイプに関連付けられた新しいコンポーネントを登録して、開発者は独自の識別コードを作成できます。
内容は次のとおりです。
データベース・オブジェクトMGD_IDが定義され、独自に作成した既存の識別コードとEPC標準の識別コードの使用が可能になりました。EPCの概念の概要は、22.7項を参照してください。MGD_IDオブジェクトは、特定のカテゴリが属するベース・コード・オブジェクトとして、または、EPCカテゴリ、NASAカテゴリなど数多くのカテゴリのRFIDタグの型としての役割を果します。各カテゴリには、タグ表現構造およびそのコンポーネントを定義する一連のタグ・スキームまたは文書が存在します。EPCカテゴリにおいて、様々なエンコーディングのタイプ(EPC標準バージョン1.1で定義)を表すコード体系(SGTIN-64、SGTIN-96、GID-96など)の定義に必要なメタデータは、デフォルトではデータベースにロードされます。ユーザーは、図22-1で示すように独自のカテゴリとスキームのエンコーディングの定義が可能であり、データベースにもロードできます。
MGD_IDオブジェクトには、2つの属性、category_id、および名前/値ペアのコンポーネントで構成されるリストが含まれます。MGD_IDオブジェクトが格納されると、オブジェクトの作成時にタグ表現をこれらのコンポーネントの名前/値ペアに解析する必要があります。
EPC標準バージョン1.1は、既存で既知のコード体系に依存しない汎用識別子(GID)タイプを1つ、EAN.UCC仕様に基づくDomain Identifierのタイプを5つ定義します。さらに、米国防総省(USDOD)の識別タイプも定義します。EAN.UCCに基づく識別タイプは、serialized global trade identification number(SGTIN)、serial shipping container code(SSCC)、serialized global location number(SGLN)、global returnable asset identifier(GRAI)、およびglobal individual asset identifier(GIAI)の5つです。
ビットレベルのエンコーディングを1つ持つGID以外の識別タイプはすべて、長さが64ビットか96ビットかによって、それぞれ2つのエンコーディングがあります。合計すると、EPCタグには13種類の異なる標準エンコーディングが存在することになります。また、タグURIおよび純粋な識別表現などバイナリ以外の表現でのエンコーディングも可能です。
各EPCエンコーディングには、独自の構造と編成があります。表22-1を参照してください。EPCエンコーディング構造フィールド名は、識別コード・パッケージAPIのparameter_listパラメータの名前/値ペアに関連しています。たとえば、SGTIN-64では、構造フィールド名はFilter Value、Company Prefix Index、Item Reference、およびSerial Numberです。
表22-1 EPCエンコーディングの一般的な構造
| エンコーディング名 | ヘッダー長(ビット) | フィールド名(parameter_listの名前/値ペア)およびフィールド長(ビット) |
|---|---|---|
|
GID-96 |
8 |
General Manager Number (8)、Object Class (24)、Serial Number (36) |
|
SGTIN-64 |
2 |
Filter Value (3)、Company Prefix Index (14)、Item Reference (20)、Serial Number (25) |
|
SGTIN-96 |
8 |
Filter Value (3)、Partition (3)、Company Prefix (20-40)、Item Reference (24-4)、Serial Number (38) |
|
SSCC-64 |
8 |
Filter Value (3)、Company Prefix Index (14)、Serial Reference (39) |
|
SSCC-96 |
8 |
Filter Value (3)、Partition (3)、Company Prefix (20-40)、Serial Reference (38-18)、Unallocated (24) |
|
SGLN-64 |
8 |
Filter Value (3)、Company Prefix Index (14)、Location Reference (20)、Serial Number (19) |
|
SGLN-96 |
8 |
Filter Value (3)、Partition (3)、Company Prefix (20-40)、Location Reference (21-1)、Serial Number (41) |
|
GRAI-64 |
8 |
Filter Value (3)、Company Prefix Index (14)、Asset Type (20)、Serial Number (19) |
|
GRAI-96 |
8 |
Filter Value (3)、Partition (3)、Company Prefix (20-40)、Asset Type (24-4)、Serial Number (38) |
|
GIAI-64 |
8 |
Filter Value (3)、Company Prefix Index (14)、Individual Asset Reference (39) |
|
GIAI-96 |
8 |
Filter Value (3)、Partition (3)、Company Prefix (20-40)、Individual Asset Reference (62-42) |
|
USDOD-64 |
8 |
Filter Value (2)、Government Managed Identifier (30)、Serial Number (24) |
|
USDOD-96 |
8 |
Filter Value (4)、Government Managed Identifier (48)、Serial Number (36) |
EPCglobalは11個のタグ・スキーム(GID-96、SGTIN-64、SGTIN-96など)を定義しています。これらのスキームにはそれぞれ多くの表現がありますが、現在最も頻繁に使用されているのはBINARY、TAG_URI、およびPURE_IDENTITYです。たとえば、SGTIN-64の情報は次のように表現できます。
BINARY: 1001100000000000001000001110110001000010000011111110011000110010 PURE_IDENTITY: urn:epc:id:sgtin:0037000.030241.1041970 TAG_URI: urn:epc:tag:sgtin-64:3.0037000.030241.1041970 LEGACY: gtin=00037000302414;serial=1041970 ONS_HOSTNAME: 030241.0037000.sgtin.id.example.com
これらの表現にはタグに関するすべての情報が含まれているものがありますが(BINARYおよびTAG_URI)、他の表現には一部の情報のみが含まれています(PURE_IDENTITY)。そのため、タグをTAG_URIからPURE_IDENTITY表現へ翻訳することはできますが、フィルタ値などの詳細情報がないかぎり、逆への翻訳は実行できません。
EPCglobalは、様々なEPC RFIDタグ表現間のデコード、エンコードおよび翻訳を定義したTag Data Translation 1.0(TDT)標準をリリースしました。デコーディングは、ある表現をフィールド/値ペアに解析することを意味し、エンコーディングはこれらのフィールドから表現を再構成することを意味します。翻訳とは、ある表現をデコーディングし、すぐに別の表現にエンコーディングすることを意味します。TDTはそれぞれがスキームを表す一連のXMLファイルを使用してこの情報を定義します。たとえば、SGTIN-64スキームは、バイナリと純粋な識別など様々なSGTIN-64表現間でのデコード、エンコードおよび翻訳を定義します。EPCglobal TDTスキーマの詳細は、EPCglobal Tag Data Translationの仕様を参照してください。
TDT仕様の主な機能は、同じXMLスキーマを使用してすべてのEPCスキームを定義できることです。この方法により、RFIDアプリケーションがパーサー、エンコーダ、およびトランスレータの記述に使用するEPCメタデータを定義する標準的な方法が作成されます。TDT仕様に従ってアプリケーションを記述した場合、そのアプリケーションから一連のEPCタグ・スキームの更新と、メタデータに従ったアクションの変更が可能である必要があります。
Oracle Databaseメタデータ構造はTDT標準と類似していますが、同一なものではありません。EPCglobal TDT仕様に合せるには、Oracle RFIDパッケージですべてのTDT互換スキームを取り込み、定義された汎用のOracle Databaseメタデータにシームレスに翻訳できる必要があります。詳細は、表22-4のEPC_TO_ORACLE関数を参照してください。
フィールドからのタグ表現の再構築、つまり、タグ・データの事前定義済の表現へのエンコーディングは、MGD_ID.format関数を使用して簡単に実行できます。同様に、タグ表現のMGD_IDオブジェクトへのデコーディングおよびこれらのオブジェクトのタグ表現へのエンコーディングも、MGDID.translate関数を使用して簡単に実行できます。詳細は、表22-3のFORMATメンバー関数およびTRANSLATE静的関数を参照してください。
EPCglobal TDT標準は強力で拡張性も高いため、Oracle RFID標準メタデータはTDT仕様と密接に関連しています。実際のOracle Database TDT XMLスキーマは、22.8項を参照してください。開発者は、このOracle Database TDT XMLスキーマを参照し、独自のタグ構造を定義できます。
図22-2に、Oracle Database Tag Data Translationマークアップ言語スキーマ図を示します。
図22-2 Oracle Database Tag Data Translationマークアップ言語スキーマ図

タグ・データ翻訳XMLのトップレベル要素は「スキーム」です。それぞれのスキームは、様々なタグ・エンコーディング表現またはレベルを定義します。SGTIN-64およびGID-96は、タグ・コード体系の例です。また、BINARYまたはPURE_IDENTITYは、これらのスキーム内のレベルの例です。各レベルには、様々な表現のフィールドへの解析方法を定義した一連のオプション、および追加の作業が必要なフィールドからの値の導出方法を定義したルールがあります。ルールには、外部表参照または解析された他のフィールドとの連結などがあります。詳細は、EPCglobalのタグ翻訳仕様を参照してください。
識別コード・パッケージは、現在のRFIDタグとサポートされるエンコーディング・タイプのEPCビット・エンコーディングの標準ファミリ、および現在のEPC標準には含まれていない進化するタグ・エンコーディングの両方をサポートする、拡張可能なフレームワークを提供します。
識別コード・パッケージは次のADTを定義します。
MGD_ID: 次の項目を定義します(詳細は、表22-2のMGD_ID ADTを参照してください)。
category_idおよびcomponentsの2つの属性。
RFIDタグを表現する識別コード・タイプ・オブジェクトを構成するための4つのMGD_IDコンストラクタ関数。
これらのADTを操作する一連のメンバー・サブプログラム。
22.3項は、これらのADTとメンバー・ファンクションの使用方法について説明しています。
22.4項および22.5項は、このようなADTと一連のユーティリティ・サブプログラムの参照情報について説明しています。参照情報の詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。
MGD_ID_COMPONENT - コンポーネント名を識別するcomp_nameと、コンポーネント値を識別するcomp_valueの2つの属性を定義します。
MGD_ID_COMPONENT_VARRAY: MGD_IDCOMPONENT型の要素を最大128個格納できる配列型を定義します。この配列型は、コンポーネントのリストがある識別コード・タイプ・オブジェクトを作成するための2つのコンストラクタ関数で使用します。
識別コード・パッケージは、事前定義済のEPC_ENCODING_CATEGORY encoding_category属性定義とサポートされるエンコーディング・タイプのビット・エンコーディング構造を提供することで、EPC仕様バージョン1.1をサポートします。この情報は、提供されるエンコーディング・メタデータ・ビューMGD_USR_ID_CATEGORYとMGD_USR_ID_SCHEME、読取り専用ビューMGD_ID_CATEGORYとMGD_ID_SCHEME、およびその基礎となる表MGD_ID_CATEGORY_TAB、MGD_ID_SCHEME_TABとMGD_ID_XML_VALIDATORでメタ情報として格納されます。詳細は、次の項およびファイルを参照してください。
22.7項は、EPC仕様バージョン1.1の製品コードおよびコード体系ファミリについて説明しています。
22.6項では、識別コード・メタデータ表とビュー、および様々なRFIDタグを解釈するために識別コード・パッケージによってメタデータがどのように使用されるかについて説明しています。
mgdmeta.sqlファイルは、EPC_ENCODING_CATEGORYカテゴリおよびそれぞれの特定のコード体系のメタ表データを示します。
何千ものRFIDタグをユーザー表のMGD_ID列型の列に格納した後に、この列に索引を作成することで、問合せのパフォーマンスが向上します。詳細は、次の項を参照してください。
22.3.2項は、MGD_ID ADTのメンバー・ファンクションを使用したファンクション索引またはビットマップ・ファンクション索引の作成について説明しています。
識別コード・パッケージは様々なユーティリティ・サブプログラムから構成されるユーティリティ・パッケージを提供します。詳細は、次の項を参照してください。
22.4項および22.5項は、各メンバー・サブプログラムについて説明しています。プロキシ情報の設定および削除には、プロキシ・ユーティリティを使用します。メタデータ・ユーティリティは、カテゴリIDの取得、カテゴリのタグ・スキームのリフレッシュ、カテゴリのタグ・スキームの削除、およびタグ・スキームの検証に使用できます。変換ユーティリティは、標準のEPCglobal Tag Data Translation(TDT)のOracle Database TDTファイルへの翻訳に使用します。
識別コード・パッケージは拡張可能であり、新規または進化するRFIDタグ固有の識別コード・タイプを独自に作成できます。エンコーディング・タイプに応じて、識別コード・タイプ、catagory_id属性値、およびコンポーネント構造が定義可能です。詳細は、次の項を参照してください。
内容は次のとおりです。
内容は次のとおりです。
RFIDタグを表現する列型としてMGD_IDを使用し、表を作成できます。次に例を示します。
例1.MGD_ID列型の使用
CREATE TABLE Warehouse_info (
Code MGD_ID,
Arrival_time TIMESTAMP,
Location VARCHAR2(256);
...);
SQL*Plusコマンド:
describe warehouse_info;
結果:
Name Null? Type ----------------------------------------- -------- ---------------------------- CODE NOT NULL MGDSYS.MGD_ID ARRIVAL_TIME TIMESTAMP(6) LOCATION VARCHAR2(256)
MGD_IDオブジェクトを構成するには、複数の方法があります。
MGD_IDオブジェクト(SGTIN-64)の構成、およびカテゴリID、タグ識別子と追加の必須パラメータのリストの受渡し
MGD_IDオブジェクト(SGTIN-64)の構成、およびカテゴリ名、カテゴリ・バージョン(NULLの場合、最新のバージョンを使用)とコンポーネントのリストの受渡し
MGD_IDオブジェクト(SGTIN-64)の構成、およびカテゴリ名、カテゴリ・バージョン、タグ識別子と追加の必須パラメータのリストの受渡し
RFIDタグがEPC標準に準拠している場合、そのカテゴリIDとコンポーネントのリストを使用してMGD_IDオブジェクトを作成できます。次に例を示します。
call DBMS_MGD_ID_UTL.set_proxy('example.com', '80');
call DBMS_MGD_ID_UTL.refresh_category('1');
select MGD_ID ('1',
MGD_ID_COMPONENT_VARRAY(
MGD_ID_COMPONENT('companyprefix','0037000'),
MGD_ID_COMPONENT('itemref','030241'),
MGD_ID_COMPONENT('serial','1041970'),
MGD_ID_COMPONENT('schemes','SGTIN-64')
)
) from DUAL;
call DBMS_MGD_ID_UTL.remove_proxy();
@constructor11.sql
.
.
.
MGD_ID ('1', MGD_ID_COMPONENT_VARRAY
(MGD_ID_COMPONENT('companyprefix', '0037000'),
MGD_ID_COMPONENT('itemref', '030241'),
MGD_ID_COMPONENT('serial', '1041970'),
MGD_ID_COMPONENT('schemes', 'SGTIN-64')))
.
.
.
MGD_IDオブジェクトの作成に追加の必須パラメータのリストが存在する場合、このコンストラクタを使用します。次に例を示します。
call DBMS_MGD_ID_UTL.set_proxy('example.com', '80');
call DBMS_MGD_ID_UTL.refresh_category('1');
select MGD_ID('1',
'urn:epc:id:sgtin:0037000.030241.1041970',
'filter=3;scheme=SGTIN-64') from DUAL;
call DBMS_MGD_ID_UTL.remove_proxy();
@constructor22.sql
.
.
.
MGD_ID('1', MGD_ID_COMPONENT_VARRAY(MGD_ID_COMPONENT('filter', '3'),
MGD_ID_COMPONENT('schemes', 'SGTIN-64'),
MGD_ID_COMPONENT('companyprefixlength', '7'),
MGD_ID_COMPONENT('companyprefix', '0037000'),
MGD_ID_COMPONENT('scheme', 'SGTIN-64'),
MGD_ID_COMPONENT('serial', '1041970'),
MGD_ID_COMPONENT('itemref', '030241')))
.
.
.
カテゴリIDとコンポーネントのリストとともにカテゴリ・バージョンを指定する必要がある場合、このコンストラクタを使用します。次に例を示します。
call DBMS_MGD_ID_UTL.set_proxy('example.com', '80');
call DBMS_MGD_ID_UTL.refresh_category
(DBMS_MGD_ID_UTL.get_category_id('EPC', NULL));
select MGD_ID('EPC', NULL,
MGD_ID_COMPONENT_VARRAY(
MGD_ID_COMPONENT('companyprefix','0037000'),
MGD_ID_COMPONENT('itemref','030241'),
MGD_ID_COMPONENT('serial','1041970'),
MGD_ID_COMPONENT('schemes','SGTIN-64')
)
) from DUAL;
call DBMS_MGD_ID_UTL.remove_proxy();
@constructor33.sql
.
.
.
MGD_ID('1', MGD_ID_COMPONENT_VARRAY
(MGD_ID_COMPONENT('companyprefix', '0037000'),
MGD_ID_COMPONENT('itemref', '030241'),
MGD_ID_COMPONENT('serial', '1041970'),
MGD_ID_COMPONENT('schemes', 'SGTIN-64')
)
)
.
.
.
カテゴリ・バージョンと追加のパラメータのリストが必要な場合、このコンストラクタを使用します。
call DBMS_MGD_ID_UTL.set_proxy('example.com', '80');
call DBMS_MGD_ID_UTL.refresh_category
(DBMS_MGD_ID_UTL.get_category_id('EPC', NULL));
select MGD_ID('EPC', NULL,
'urn:epc:id:sgtin:0037000.030241.1041970',
'filter=3;scheme=SGTIN-64') from DUAL;
call DBMS_MGD_ID_UTL.remove_proxy();
@constructor44.sql
.
.
.
MGD_ID('1', MGD_ID_COMPONENT_VARRAY
(MGD_ID_COMPONENT('filter', '3'),
MGD_ID_COMPONENT('schemes', 'SGTIN-64'),
MGD_ID_COMPONENT('companyprefixlength', '7'),
MGD_ID_COMPONENT('companyprefix', '0037000'),
MGD_ID_COMPONENT('scheme', 'SGTIN-64'),
MGD_ID_COMPONENT('serial', '1041970'),
MGD_ID_COMPONENT('itemref', '030241')
)
)
.
.
.
次の例は、表に各MGD_IDオブジェクトと追加の列値を挿入し、WAREHOUSE_INFO表を移入する方法を示しています。
call DBMS_MGD_ID_UTL.set_proxy('example.com', '80');
call DBMS_MGD_ID_UTL.refresh_category
(DBMS_MGD_ID_UTL.get_category_id('EPC', NULL));
INSERT INTO WAREHOUSE_INFO (code, arrival_time, location)
values (MGDSYS.MGD_ID ('EPC',
NULL,
'urn:epc:id:sgtin:0037000.030241.1041970',
null
),
SYSDATE,
'SHELF_123');
INSERT INTO WAREHOUSE_INFO (code, arrival_time, location)
values (MGDSYS.MGD_ID ('EPC',
NULL,
'urn:epc:id:sgtin:0037000.053021.1012353',
null
),
SYSDATE,
'SHELF_456');
INSERT INTO WAREHOUSE_INFO (code, arrival_time, location)
values (MGDSYS.MGD_ID ('EPC',
NULL,
'urn:epc:id:sgtin:0037000.020140.10174832',
null
),
SYSDATE,
'SHELF_1034');
COMMITT;
call DBMS_MGD_ID_UTL.remove_proxy();
MGD_ID列型を問い合せるには、3つの方法があります。
MGD_ID列型を問い合せます。アイテム参照が030241であるすべてのアイテムを検索します。
SELECT location, wi.code.get_component('itemref') as itemref,
wi.code.get_component('serial') as serial
FROM warehouse_info wi WHERE wi.code.get_component('itemref') = '030241';
LOCATION |ITEMREF |SERIAL
---------------|----------|----------
SHELF_123 |030241 |1041970
MGD_ID ADTのメンバー関数を使用して問い合せます。表内のすべてのRFIDタグの純粋な識別表現を選択します。
SELECT wi.code.format(null,'PURE_IDENTITY') as PURE_IDENTITY FROM warehouse_info wi; PURE_IDENTITY ------------------------------------------------------------------------------- urn:epc:id:sgtin:0037000.030241.1041970 urn:epc:id:gid:0037000.053021.1012353 urn:epc:id:sgtin:0037000.020140.10174832
get_componentメンバー関数またはそのバリエーションの簡易関数を使用するファンクション索引を作成し、RFIDタグの特定のコンポーネントの問合せのパフォーマンスを改善できます。次に例を示します。
CREATE INDEX warehouseinfo_idx2
on warehouse_info(code.get_component('itemref'));
また、get_componentメンバー関数またはそのバリエーションの簡易関数を使用するビットマップ・ファンクション索引を作成し、RFIDタグの特定のコンポーネントの問合せのパフォーマンスも改善できます。次に例を示します。
CREATE BITMAP INDEX warehouseinfo_idx3
on warehouse_info(code.get_component('serial'));
MGD_ID ADTには、次のADTで動作するメンバー・サブプログラムが含まれます。詳細は、表22-2のMGD_ID_COMPONENT、MGD_ID_COMPONENT_VARRAYおよびMGD_ID ADTの参照情報を参照してください。MGD_ID ADTの定義およびそのメンバー・サブプログラムについては、mgdtyp.sqlファイルを参照してください。
内容は次のとおりです。
get_component関数の定義は、次のとおりです。
MEMBER FUNCTION get_component(component_name IN VARCHAR2) RETURN VARCHAR2 DETERMINISTIC,
識別コードの各コンポーネントには名前が付けられています。この名前は、コード・タイプを登録する際に定義されます。識別コード・タイプの登録方法の詳細は、22.3.4項を参照してください。
get_component関数は、コンポーネントの名前であるcomponent_nameをパラメータとして取り、識別コードを解析するためにメタデータ表内に登録されたメタデータを使用し、component_nameの名前とコンポーネントを戻します。
get_component関数はSQL問合せで使用できます。たとえば、itemrefという名前のコンポーネントのコーディング済アイテムの現在の場所の検索、つまり、03024のアイテムを参照するすべてのアイテムを検索するとします。コード・タグがitemrefを1つのコンポーネントとしてエンコーディングしているため、次のSQL問合せを使用できます。
SELECT location,
w.code.get_component('itemref') as itemref,
w.code.get_component('serial') as serial
FROM warehouse_info w
WHERE w.code.get_component('itemref') = '030241';
LOCATION |ITEMREF |SERIAL
---------------|----------|----------
SHELF_123 |030241 |1041970
他のメンバー関数のリストは、表22-3を参照してください。
RFIDリーダーは、タグに格納されているビット列を読み取ります。タグ・データと、リーダーID、タイムスタンプなどのその他の情報は、まずエッジ・サーバーで処理および正規化され、事前にフィルタリングされます。その後、多くのアプリケーション・シナリオでは、情報は永続的に格納され後で取得される必要があります。表22-1で示したように、Oracle DatabaseではEPC標準で定義されたコード表現体系が事前に登録されているため、様々なEPCタグのコード構造表現を理解します。これにより、Oracle DatabaseはすべてのEPCコード体系を理解し、様々なタグ表現をフィールドに解析できます。ユーザーは、他のエンコーディング・テクノロジを使用した識別コードの独自のコーディング構造を登録することもできます。このように、システムは拡張可能です。
22.1項で示したとおり、それぞれのEPCglobalタグ・スキーム(GID-96、SGTIN-64、SGTIN-96など)には様々な表現があります。最も頻繁に使用されるのは、BINARY、TAG_URIおよびPURE_IDENTITYです。
これらの表現にはタグに関するすべての情報が含まれているものがありますが(BINARYおよびTAG_URI)、他の表現には一部の情報のみが含まれています(PURE_IDENTITY)。そのため、タグをTAG_URIからPURE_IDENTITY表現へ翻訳することはできますが、フィルタ値などの詳細情報がないかぎり、逆への翻訳(PURE_IDENTITYからTAG_URIへ)は実行できません。
MGD_IDコンストラクタの1つは、カテゴリ名(EPCなど)、カテゴリ・バージョン、タグ識別子(EPCの場合、以前記述した表現に含まれる識別子である必要があります)、およびタグ表現の解析に必要な追加のパラメータ・リストの4つのフィールドを使用します。たとえば、次のコードはBINARY表現からMGD_IDオブジェクトを作成します。
SELECT MGD_ID
('EPC',
null,
'1001100000000000001000001110110001000010000011111110011000110010',
null
)
AS NEW_RFID_CODE FROM DUAL;
NEW_RFID_CODE(CATEGORY_ID, COMPONENTS(NAME, VALUE))
--------------------------------------------------------------------------------
MGD_ID ('1',
MGD_ID_COMPONENT_VARRAY(MGD_ID_COMPONENT('filter', '3'),
MGD_ID_COMPONENT('schemes', 'SGTIN-64'),
MGD_ID_COMPONENT('companyprefixlength', '7'),
MGD_ID_COMPONENT('companyprefix', '0037000'),
MGD_ID_COMPONENT('companyprefixindex', '1'),
MGD_ID_COMPONENT('serial', '1041970'),
MGD_ID_COMPONENT('itemref', '030241')
)
)
たとえば、次のようにフィルタ値を追加し、タグのTAG_URI表現からコールが実行された場合、同一のオブジェクトが作成されます。
SELECT MGD_ID ('EPC',
null,
'urn:epc:tag:sgtin-64:3.0037000.030241.1041970',
null
)
as NEW_RFID_CODE FROM DUAL;
NEW_RFID_CODE(CATEGORY_ID, COMPONENTS(NAME, VALUE))
--------------------------------------------------------------------------------
MGD_ID ('1',
MGD_ID_COMPONENT_VARRAY (
( MGD_ID_COMPONENT('filter', '3'),
MGD_ID_COMPONENT('schemes', 'SGTIN-64'),
MGD_ID_COMPONENT('companyprefixlength', '7'),
MGD_ID_COMPONENT('companyprefix', '0037000'),
MGD_ID_COMPONENT('serial', '1041970'),
MGD_ID_COMPONENT('itemref', '030241')
)
)
識別コード・パッケージのその他の便利な機能として、タグ・データを事前定義済の表現にエンコーディングできます。たとえば、倉庫からある在庫を小売業者に送る前に、どの在庫を小売業者に送るかを記述した請求書を送る必要があるとします。請求書は、倉庫から送る純粋な識別URIのリストとなります。WAREHOUSE_INFO表のすべての在庫を送る場合、次の例では必要なURIを構成します。
SELECT wi.code.format (null,'PURE_IDENTITY') as PURE_IDENTITY FROM warehouse_info wi; PURE_IDENTITY -------------------------------------------------------------------------------- urn:epc:id:sgtin:0037000.030241.1041970 urn:epc:id:gid:0037000.053021.1012353 urn:epc:id:sgtin:0037000.020140.10174832
識別コード・パッケージは、タグ表現をMGD_IDオブジェクトにデコードし、これらのオブジェクトをタグ表現にエンコードできます。MGD_ID.translate関数を使用して、この2つの手順を1つにまとめることができます。静的な翻訳により、RFIDタグを1つの表現から別の表現に変換できます。次に例を示します。
SELECT MGD_ID.translate ('EPC',
null,
'urn:epc:id:sgtin:0037000.030241.1041970',
'filter=3;scheme=SGTIN-64',
'BINARY'
)
as BINARY FROM DUAL;
BINARY
--------------------------------------------------------------------------------
1001100000000000001000001110110001000010000011111110011000110010
この例では、バイナリ表現には純粋な識別表現より多くの情報が含まれます。特に、バイナリ表現にはフィルタ値も含まれます。この場合、SGTIN-64とSGTIN-96の区別にスキーム値も指定する必要があります。そのため、翻訳コールを正常に実行するためには、ファンクション・コールにおいて欠落したフィルタのパラメータ情報を提供し、スキーム名を指定する必要があります。
EPCglobal TDT標準は強力で拡張性も高いため、Oracle Database RFID標準メタデータはTDT仕様と密接に関連しています。そのため、識別コード・パッケージは拡張可能であり、汎用的なメタデータを使用して独自のカテゴリとタグ構造を作成できます。識別コードのカテゴリを作成するには、DBMS_MGD_ID_UTIL.create_category関数を使用します。
たとえば、CONTRACTOR_TAGとEMPLOYEE_TAGの2つの型のタグがあるMGD_SAMPLE_CATEGORYというカテゴリを作成するとします。このカテゴリと2つのメタデータ・スキームを使用する会社では、正社員と契約社員に異なるアクセス権限を付与する必要がある場合があります。そのため、セキュリティ・ソフトウェアはRFIDリーダーにおいて2つの権限の違いを迅速に識別できる必要があります。次のスクリプトはMGD_SAMPLE_CATEGORYというカテゴリをカテゴリ・バージョン1.0で作成します。組織名はOracle、URIはhttp://www.oracle.com/mgd/sampleとなります。22.3.4.2項の例を参照してください。
続いて、次のようなCONTRACTOR_TAGメタデータ・スキームを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<TagDataTranslation version="0.04" date="2005-04-18T16:05:00Z"
xmlns:xsi="http://www.w3.org/2001/XMLSchema"
xmlns="oracle.mgd.idcode">
<scheme name="CONTRACTOR_TAG" optionKey="1" xmlns="">
<level type="URI" prefixMatch="mycompany.contractor.">
<option optionKey="1" pattern="mycompany.contractor.([0-9]*).([0-9]*)"
grammar="''mycompany.contractor.'' contractorID ''.'' divisionID">
<field seq="1" characterSet="[0-9]*" name="contractorID"/>
<field seq="2" characterSet="[0-9]*" name="divisionID"/>
</option>
</level>
<level type="BINARY" prefixMatch="11">
<option optionKey="1" pattern="11([01]{7})([01]{6})"
grammar="''11'' contractorID divisionID ">
<field seq="1" characterSet="[01]*" name="contractorID"/>
<field seq="2" characterSet="[01]*" name="divisionID"/>
</option>
</level>
</scheme>
</TagDataTranslation>
CONTRACTOR_TAGスキームには、2つのエンコーディング・レベル、つまり2つのタグ表現方法が含まれます。最初のレベルはURI、2つ目のレベルはBINARYです。URI表現は、接頭辞「mycompany.contractor.」で始まり、ピリオドで区切られた2つの数値フィールドが続きます。2つのフィールドの名前はcontractorIDとdivisionIDです。オプション・タグのパターン・フィールドはタグURI表現の解析構造を定義します。grammarフィールドはURI表現の再構成方法を定義します。BINARY表現も同じ方法で理解できます。この表現は接頭辞「01」で始まり、同じ2つのフィールドcontractorIDとdivisionIDが続きます。ここでは、それぞれバイナリ形式となります。このXMLメタデータ構造を指定すると、contractorタグはURI表現およびBINARY表現からデコードされ、結果のフィールドをこれらの表現のいずれかに再度エンコードできます。
EMPLOYEE_TAGスキームも同様に定義され、次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<TagDataTranslation version="0.04" date="2005-04-18T16:05:00Z"
xmlns:xsi="http://www.w3.org/2001/XMLSchema"
xmlns="oracle.mgd.idcode">
<scheme name="EMPLOYEE_TAG" optionKey="1" xmlns="">
<level type="URI" prefixMatch="mycompany.employee.">
<option optionKey="1" pattern="mycompany.employee.([0-9]*).([0-9]*)"
grammar="''mycompany.employee.'' employeeID ''.'' divisionID">
<field seq="1" characterSet="[0-9]*" name="employeeID"/>
<field seq="2" characterSet="[0-9]*" name="divisionID"/>
</option>
</level>
<level type="BINARY" prefixMatch="01">
<option optionKey="1" pattern="01([01]{7})([01]{6})"
grammar="''01'' employeeID divisionID ">
<field seq="1" characterSet="[01]*" name="employeeID"/>
<field seq="2" characterSet="[01]*" name="divisionID"/>
</option>
</level>
</scheme>
</TagDataTranslation>;
前に作成したカテゴリIDにこれらのスキームを追加するには、DBMS_MGD_ID_UTIL.add_scheme関数を使用します。
次のスクリプトは、MGD_SAMPLE_CATEGORYカテゴリの作成、contractorスキームとemployeeスキームのMGD_SAMPLE_CATEGORYカテゴリへの追加、MGD_SAMPLE_CATEGORYスキームの検証、contractorスキームとemployeeスキームのタグ翻訳のテストを実行します。その後、contractorスキームを削除し、contractorスキームのタグ翻訳をテストします。削除したcontractorスキームについては、予期した例外が戻されることを確認します。employeeスキームの翻訳をテストし、予期した値が返されることを確認してからMGD_SAMPLE_CATEGORYカテゴリを削除します。
--contents of add_scheme2.sql
SET LINESIZE 160
CALL DBMS_MGD_ID_UTL.set_proxy('example.com', '80');
---------------------------------------------------------------------
---CREATE CATEGORY, ADD_SCHEME, REMOVE_SCHEME, REMOVE_CATEGORY-------
---------------------------------------------------------------------
DECLARE
amt NUMBER;
buf VARCHAR2(32767);
pos NUMBER;
tdt_xml CLOB;
validate_tdtxml VARCHAR2(1042);
category_id VARCHAR2(256);
BEGIN
-- remove the testing category if it exists
DBMS_MGD_ID_UTL.remove_category('MGD_SAMPLE_CATEGORY', '1.0');
-- create the testing category 'MGD_SAMPLE_CATEGORY', version 1.0
category_id := DBMS_MGD_ID_UTL.CREATE_CATEGORY('MGD_SAMPLE_CATEGORY', '1.0', 'Oracle',
'http://www.oracle.com/mgd/sample');
-- add contractor scheme to the category
DBMS_LOB.CREATETEMPORARY(tdt_xml, true);
DBMS_LOB.OPEN(tdt_xml, DBMS_LOB.LOB_READWRITE);
buf := '<?xml version="1.0" encoding="UTF-8"?>
<TagDataTranslation version="0.04" date="2005-04-18T16:05:00Z"
xmlns:xsi="http://www.w3.org/2001/XMLSchema"
xmlns="oracle.mgd.idcode">
<scheme name="CONTRACTOR_TAG" optionKey="1" xmlns="">
<level type="URI" prefixMatch="mycompany.contractor.">
<option optionKey="1" pattern="mycompany.contractor.([0-9]*).([0-9]*)"
grammar="''mycompany.contractor.'' contractorID ''.'' divisionID">
<field seq="1" characterSet="[0-9]*" name="contractorID"/>
<field seq="2" characterSet="[0-9]*" name="divisionID"/>
</option>
</level>
<level type="BINARY" prefixMatch="11">
<option optionKey="1" pattern="11([01]{7})([01]{6})"
grammar="''11'' contractorID divisionID ">
<field seq="1" characterSet="[01]*" name="contractorID"/>
<field seq="2" characterSet="[01]*" name="divisionID"/>
</option>
</level>
</scheme>
</TagDataTranslation>';
amt := length(buf);
pos := 1;
DBMS_LOB.WRITE(tdt_xml, amt, pos, buf);
DBMS_LOB.CLOSE(tdt_xml);
DBMS_MGD_ID_UTL.ADD_SCHEME(category_id, tdt_xml);
-- add employee scheme to the category
DBMS_LOB.CREATETEMPORARY(tdt_xml, true);
DBMS_LOB.OPEN(tdt_xml, DBMS_LOB.LOB_READWRITE);
buf := '<?xml version="1.0" encoding="UTF-8"?>
<TagDataTranslation version="0.04" date="2005-04-18T16:05:00Z"
xmlns:xsi="http://www.w3.org/2001/XMLSchema"
xmlns="oracle.mgd.idcode">
<scheme name="EMPLOYEE_TAG" optionKey="1" xmlns="">
<level type="URI" prefixMatch="mycompany.employee.">
<option optionKey="1" pattern="mycompany.employee.([0-9]*).([0-9]*)"
grammar="''mycompany.employee.'' employeeID ''.'' divisionID">
<field seq="1" characterSet="[0-9]*" name="employeeID"/>
<field seq="2" characterSet="[0-9]*" name="divisionID"/>
</option>
</level>
<level type="BINARY" prefixMatch="01">
<option optionKey="1" pattern="01([01]{7})([01]{6})"
grammar="''01'' employeeID divisionID ">
<field seq="1" characterSet="[01]*" name="employeeID"/>
<field seq="2" characterSet="[01]*" name="divisionID"/>
</option>
</level>
</scheme>
</TagDataTranslation>';
amt := length(buf);
pos := 1;
DBMS_LOB.WRITE(tdt_xml, amt, pos, buf);
DBMS_LOB.CLOSE(tdt_xml);
DBMS_MGD_ID_UTL.ADD_SCHEME(category_id, tdt_xml);
-- validate the scheme
dbms_output.put_line('Validate the MGD_SAMPLE_CATEGORY Scheme');
validate_tdtxml := DBMS_MGD_ID_UTL.validate_scheme(tdt_xml);
dbms_output.put_line(validate_tdtxml);
dbms_output.put_line('Length of scheme xml is: '||DBMS_LOB.GETLENGTH(tdt_xml));
-- test tag translation of contractor scheme
dbms_output.put_line(
mgd_id.translate('MGD_SAMPLE_CATEGORY', NULL,
'mycompany.contractor.123.45',
NULL, 'BINARY'));
dbms_output.put_line(
mgd_id.translate('MGD_SAMPLE_CATEGORY', NULL,
'111111011101101',
NULL, 'URI'));
-- test tag translation of employee scheme
dbms_output.put_line(
mgd_id.translate('MGD_SAMPLE_CATEGORY', NULL,
'mycompany.employee.123.45',
NULL, 'BINARY'));
dbms_output.put_line(
mgd_id.translate('MGD_SAMPLE_CATEGORY', NULL,
'011111011101101',
NULL, 'URI'));
DBMS_MGD_ID_UTL.REMOVE_SCHEME(category_id, 'CONTRACTOR_TAG');
-- Test tag translation of contractor scheme. Doesn't work any more.
BEGIN
dbms_output.put_line(
mgd_id.translate('MGD_SAMPLE_CATEGORY', NULL,
'mycompany.contractor.123.45',
NULL, 'BINARY'));
dbms_output.put_line(
mgd_id.translate('MGD_SAMPLE_CATEGORY', NULL,
'111111011101101',
NULL, 'URI'));
EXCEPTION
WHEN others THEN
dbms_output.put_line('Contractor tag translation failed: '||SQLERRM);
END;
-- Test tag translation of employee scheme. Still works.
BEGIN
dbms_output.put_line(
mgd_id.translate('MGD_SAMPLE_CATEGORY', NULL,
'mycompany.employee.123.45',
NULL, 'BINARY'));
dbms_output.put_line(
mgd_id.translate('MGD_SAMPLE_CATEGORY', NULL,
'011111011101101',
NULL, 'URI'));
EXCEPTION
WHEN others THEN
dbms_output.put_line('Employee tag translation failed: '||SQLERRM);
END;
-- remove the testing category, which also removes all the associated schemes
DBMS_MGD_ID_UTL.remove_category('MGD_SAMPLE_CATEGORY', '1.0');
END;
/
SHOW ERRORS;
call DBMS_MGD_ID_UTL.remove_proxy();
@add_scheme3.sql
.
.
.
Validate the MGD_SAMPLE_CATEGORY Scheme
EMPLOYEE_TAG;URI,BINARY;divisionID,employeeID
Length of scheme xml is: 933
111111011101101
mycompany.contractor.123.45
011111011101101
mycompany.employee.123.45
Contractor tag translation failed: ORA-55203: Tag data translation level not found
ORA-06512: at "MGDSYS.DBMS_MGD_ID_UTL", line 54
ORA-06512: at "MGDSYS.MGD_ID", line 242
ORA-29532: Java call terminated by uncaught Java
exception: oracle.mgd.idcode.exceptions.TDTLevelNotFound: Matching level not
found for any configured scheme
011111011101101
mycompany.employee.123.45
.
.
.
表22-2は識別コード・パッケージADTを示します。
表22-2 識別コード・パッケージADT
| ADT名 | 説明 |
|---|---|
|
|
コンポーネントを定義する名前/値ペア属性を指定するデータ型です。 |
|
|
データ型を指定します。最大128個のコンポーネントのリストを名前/値属性ペアで指定するデータ型で、識別コード・タイプ・オブジェクトを作成するための2つのコンストラクタ関数で使用されます。 |
|
|
この識別コードとコンポーネントのリストのコード・カテゴリのカテゴリ識別子を指定する識別コード・タイプを表します。 |
表22-3はMGD_ID ADTのサブプログラムを示します。
MGD_ID ADTで定義されたサブプログラムに渡されるすべての値と名前は、特に記載のないかぎり、大/小文字を区別しません。大/小文字を保持するには、値を二重引用符で囲みます。
表22-4はDBMS_MGD_ID_UTLパッケージのユーティリティ・プログラムを示します。
MGD_ID ADTで定義されたサブプログラムに渡されるすべての値と名前は、特に記載のないかぎり、大/小文字を区別しません。大/小文字を保持するには、値を二重引用符で囲みます。
表22-4 DBMS_MGD_ID_UTLパッケージ・ユーティリティ・サブプログラム
| サブプログラム | 説明 |
|---|---|
|
|
既存のカテゴリにタグ・データ翻訳スキームを追加します。 |
|
|
カテゴリまたはカテゴリのバージョンを作成します。 |
|
|
EPCglobal Tag Data Translation(TDT)XMLをOracle Database Tag Data Translation XMLに変換します。 |
|
|
カテゴリ名とカテゴリ・バージョンを指定した場合、カテゴリIDを戻します。 |
|
|
指定したスキームのすべての関連するコンポーネント名をセミコロン(;)で区切って戻します。 |
|
|
指定したスキームのエンコーディング(フォーマット)のリストをセミコロン(;)で区切って戻します。 |
|
|
現在のJavaのトレース・ロギング・レベルを表す整数を戻します。 |
|
|
現在のPL/SQLのトレース・ロギング・レベルを表す整数を戻します。 |
|
|
指定したカテゴリのスキーム名のリストをセミコロン(;)で区切って戻します。 |
|
|
指定したスキームのOracle Database Tag Data Translation XMLを戻します。 |
|
|
Oracle Database Tag Data Translationスキーマを戻します。 |
|
|
指定したカテゴリのJavaスタックに関するメタデータ情報をリフレッシュします。 |
|
|
関連するすべてのTDT XMLを含むカテゴリを削除します。 |
|
|
プロキシ・サーバーのホストとポートの設定を解除します。 |
|
|
カテゴリのタグ・スキームを削除します。 |
|
|
Javaのロギング・レベルを設定します。 |
|
|
PL/SQLのトレース・ロギング・レベルを設定します。 |
|
|
インターネット・アクセス用に、プロキシ・サーバーのホストとポートを設定します。 |
|
|
入力タグ・データ翻訳XMLをOracle Database Tag Data Translationスキーマで検証します。 |
この項では、識別コード・メタデータ表とビュー、および様々なRFIDタグを解釈するために識別コード・パッケージによってメタデータがどのように使用されるかについて説明します。これらのメタ表ビュー、およびトリガーの作成は、識別コード・パッケージのインストール時に自動的に実行されます。
エンコーディング・メタデータ・ビューはエンコーディング・カテゴリとスキームの格納に使用します。アプリケーション開発者は、自身の識別コードのメタ情報をこれらのビューに挿入できます。MGD_ID ADTは、エンコーディングのメタデータがメタ表に格納されているかぎり、そのエンコーディングを解釈するように設計されています。アプリケーション開発者がEPC仕様バージョン1.1で定義されたエンコーディングのみを使用する場合、EPC仕様バージョン1.1で指定された製品コードは事前定義済のため、メタ表について考慮する必要はありません。
エンコーディング・メタデータ・ビューには次の2種類があります。
user_mgd_id_categoryでは、セッション・ユーザーが定義したエンコーディング・カテゴリ情報が格納されます。
user_mgd_id_schemeでは、セッション・ユーザーが定義したエンコーディング・タイプ情報が格納されます。
システムで事前定義済のエンコーディング・メタデータとユーザー定義のメタデータを確認するために、次の読取り専用ビューを問い合せることができます。
mgd_id_categoryでは、システムまたはセッション・ユーザーが定義したエンコーディング・カテゴリ情報を問い合せることができます。
mgd_id_schemeでは、システムまたはセッション・ユーザーが定義したエンコーディング・タイプ情報を問い合せることができます。
前述のビューの基礎となるメタデータ表は、次のとおりです。
mgd_id_xml_validator
mgd_id_category_tab
mgd_id_scheme_tab
識別コード・パッケージのシステム・ユーザー以外は、この表を操作できません。ユーザーは、メタデータ表を直接使用できません。ユーザーは、読取り専用ビューとDBMS_MGD_ID_UTLパッケージに記述されたメタデータ関数を使用する必要があります。
|
参照: DBMS_MGD_ID_UTLパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。 |
メタデータ・ビュー定義
表22-5、表22-6、表22-7および表22-8は、mgdview.sqlファイルで定義したとおり、それぞれMGD_ID_CATEGORY、USER_ID_CATEGORY、MGD_ID_SCHMEおよびUSER_MGD_ID_SCHMEのメタデータ・ビュー定義を示します。
表22-5 MGD_ID_CATEGORYメタデータ・ビューの定義と説明
| 列名 | データ型 | 説明 |
|---|---|---|
|
|
|
カテゴリ識別子 |
|
|
|
カテゴリ名 |
|
|
|
カテゴリを定義した組織 |
|
|
|
カテゴリ・バージョン |
|
|
|
カテゴリを示すURI |
表22-6 USER_MGD_ID_CATEGORYメタデータ・ビューの定義と説明
| 列名 | データ型 | 説明 |
|---|---|---|
|
|
|
カテゴリ識別子 |
|
|
|
カテゴリ名 |
|
|
|
カテゴリを定義した組織 |
|
|
|
カテゴリ・バージョン |
|
|
|
カテゴリを示すURI |
表22-7 MGD_ID_SCHEMEメタデータ・ビューの定義と説明
| 列名 | データ型 | 説明 |
|---|---|---|
|
|
|
カテゴリ識別子 |
|
|
|
SGTIN-96、GID-96などのコード体系名 |
|
|
|
このコード体系のタグ・データ翻訳XML |
|
|
|
カンマで区切られたエンコーディング。たとえば、SGTIN-96の場合は |
|
|
|
各レベルから抽出し組み合せた関連コンポーネント名。それぞれカンマで区切られます。たとえば、GID-96の場合はobjectclass, generalmanager, serial。 |
表22-8 USER_MGD_ID_SCHEMEメタデータ・ビューの定義と説明
| 列名 | データ型 | 説明 |
|---|---|---|
|
|
|
カテゴリ識別子 |
|
|
|
SGTIN-96、GID-96などのコード体系名 |
|
|
|
このコード体系のタグ・データ翻訳XML |
|
|
|
カンマで区切られたエンコーディング。たとえば、SGTIN-96の場合は |
|
|
|
各レベルから抽出し組み合せた関連コンポーネント名。それぞれカンマで区切られます。たとえば、GID-96の場合はobjectclass, generalmanager, serial。 |
内容は次のとおりです。
Radio Frequency Identification(RFID)テクノロジは、直列処理が不要となり、重要なサプライ・チェーン・トランザクションの自動化が可能であるため、供給業者、卸売業者、製造業者、小売業者の間で進化を続けています。電子製品コード(EPC)とは、RFIDタグやその他の手段によりオブジェクトを識別する世界共通の識別スキームであり、新たな基準として幅広い支持を集めています。在庫管理の改善と、サプライ・チェーンの可視性を高めることで、企業における倉庫と配送のコストが削減できます。
標準化されたEPC識別子は、様々な業界のニーズに応えるよう設計されたメタコード体系です。その結果、EPCはすべてのEPC準拠タグで一意となるような一連のコード体系および手段を表すようになりました。EPCバージョン1.1には、次の固有のコード体系が含まれます。
一般ID(GID)
EAN.UCC Global Trade Item Number(GTIN)のシリアル化バージョン
EAN.UCC Serial Shipping Container Code(SSCC)
EAN.UCC Global Location Number(GLN)
EAN.UCC Global Returnable Asset Identifier(GRAI)
EAN.UCC Global Individual Asset Identifier(GIAI)
RFIDアプリケーションは、大量のEPCデータをデータベースに格納する必要があります。EPCデータを効率的に使用するには、データベース側でEPCデータの異なるコード体系を認識する必要もあります。
EPCは新たな基準です。そのため、様々な業界で使用されている番号付けのスキームをすべて網羅しておらず、EPCバージョン1.0からEPCバージョン1.1への変更からも明らかであるように、EPC自体が現在も進化しています。
識別コード・パッケージにより、Oracle DatabaseでEPCコード体系を認識できるようになります。これにより、Oracle DatabaseにおいてEPCデータの効率的な記憶域およびコンポーネント・レベルの取得が可能になるのみではなく、EPCデータのエンコーディングとデコーディング、およびビット・エンコーディングとURIエンコーディング間の変換をサポートする機能を持つようになります。
識別コード・パッケージは、開発者がEPC標準に含まれていない自分のコード体系を定義する拡張可能なフレームワークを提供します。この拡張機能により、Oracle Databaseは進化する将来のEPC標準にも対応可能となります。
この章では、EPCを含む様々な製品コードのOracle Databaseでの格納、取得、エンコーディングおよびデコーディングの要件について説明し、識別コード・パッケージ・ソリューションがデータ型、メタデータ表およびPL/SQLパッケージを提供することで、これらの要件をどのように満たしているかについて説明します。
Global Trade Identification Number(GTIN)およびSerializable Global Trade Identification Number(SGTIN)
Global Location Number(GLN)およびSerializable Global Location Number(SGLN)
電子製品コード(tm)(EPC(tm))は、Radio Frequency Identification(RFID)タグおよびその他の手段を使用して物理オブジェクトを世界的に識別するための識別スキームです。標準のEPCデータは、個別のオブジェクトを一意に識別するEPC(またはEPC識別子)およびEPCタグを効果的かつ効率的に読み取る必要がある場合はオプションのフィルタ値で構成されています。この標準のデータに加え、EPCタグの特定のクラスでは、ユーザー定義データも使用できます。
EPC識別子は、既存のコード体系(可能な場合)の対処と、必要に応じたスキームの定義により、様々な業界のニーズをサポートするために設計されたメタコード体系です。これらのコード体系は、特定の業界または業界グループのドメインでオブジェクト識別子を提供していることを示すため、ドメインIDと呼ばれます。これにより、EPCは一連のコード体系(または「ネームスペース」)を表し、すべてのEPC準拠タグで一意の手段となります。
EPCglobal EPC Data Standards Version 1.1では、EPCの抽象的な内容と、RFIDタグ、インターネットURIおよびその他の表現の形式における具体的な認識を定義します。EPCバージョン1.1では、特定のコード体系には、汎用識別子(GID)、EAN.UCC Global Trade Item Number(GTIN®)のシリアル化バージョン、EAN.UCC Serial Shipping Container Code(SSCC®)、EAN.UCC Global Location Number(GLN®)、EAN.UCC Global Returnable Asset Identifier(GRAI®)、EAN.UCC Global Individual Asset Identifier(GIAI®)が含まれます。
EPCの純粋な識別とは、特定の物理エンティティまたは論理エンティティに関連付けられた識別であり、RFタグ、バーコードおよびデータベース・フィールドなどの特定のエンコーディング媒体に依存しません。そのため、純粋な識別は、エンティティを識別するために使用される抽象的な名前または数値です。純粋な識別は、特定のエンティティを一意に識別するために必要な情報のみで構成されます。
EPCエンコーディングは、純粋なエンコーディングと、フィルタ値などの詳細情報を、特定の構文(通常は特定のサイズの値フィールドで構成される)に変換するものです。指定した純粋な識別には、バーコード・エンコーディング、様々なタグ・エンコーディング、および様々なURIエンコーディングなどの多数のエンコーディングが含まれている可能性があります。エンコーディングには、識別以外の追加データ(一部のエンコーディングで使用されるフィルタ値)などが含まれている場合もあり、保持する追加データはコード体系により指定します。
たとえば、EAN.UCCシステムで定義されたSerial Shipping Container Code(SSCC)形式は純粋な識別の例です。EPC-SSCC 96ビット形式にエンコーディングされたSSCCはエンコーディングの一例です。
タグのEPCエンコーディングはビット文字列であり、階層化された可変長のヘッダーとそれに続く一連の数値フィールドから構成されます。数値フィールドは、ヘッダー値によってその全体の長さ、構造、機能が完全に決定されます。
Global Trade Identification Number(GTIN)は、EAN.UCCシステム内で、世界規模で取引品目を一意に識別する場合に使用します。Serialized Global Trade Identification Number(SGTIN)はEPC標準バージョン1.1での識別型です。General EAN.UCC Specifications(GenSpec5.0)で定義されているEAN.UCC GTINコードに基づいています。GTINは特定の製品やSKUなど、特定のオブジェクトのクラスを識別します。GTINと一意のシリアル番号を組み合せたものはシリアル化GTIN(SGTIN)と呼ばれます。
Serial Shipping Container Code(SSCC)はGeneral EAN.UCC Specifications(GenSpec5.0)で定義されています。EAN.UCCシステム内の物流単位の一意の識別にはSSCCを使用します。SSCCは個別のオブジェクトへの割当てを想定しています。
Global Location Number(GLN)はGeneral EAN.UCC Specifications(GenSpec5.0)で定義されています。GLNは、ドックのドアや倉庫のスロットなどの個別の一意の物理的位置、または倉庫全体などの物理的位置の集合を表現できます。また、GLNは業務(発注など)を行う組織のような論理的エンティティも表現できます。GLNと一意のシリアル番号を組み合せたものはシリアル化GLN(SGLN)と呼ばれます。ただし、EAN.UCCコミュニティがGLN拡張の適切な方法を決定するまでは、シリアル番号フィールドは予約済となり使用できません。
特定の値の輸送装置または再利用可能なパッケージを、リターナブル資産といいます。Global Returnable Asset Identifier(GRAI)は、リターナブル資産を一意に識別するためにGeneral EAN.UCC Specifications(GenSpec5.0)で定義されています。
Global Individual Asset Identifier(GIAI)はGeneral EAN.UCC Specifications(GenSpec5.0)で定義されています。GTINとは異なり、GIAIは個別のオブジェクトへの割当てを想定しています。Global Individual Asset Identifier(GIAI)は、会社の固定在庫の一部であるエンティティを一意に識別します。GIAIは、組織のすべての固定資産を識別します。
RFID EPCネットワークは、資産を識別、追跡および検索します。物理オブジェクトは、一意のRFIDが有効となっているEPCで識別します。
Oracle Database Tag Data TranslationスキーマはEPCglobal TDTスキーマに類似していますが、同一なものではありません。Oracle Database TDTの内容は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="oracle.mgd.idcode"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tdt="oracle.mgd.idcode" elementFormDefault="qualified"
attributeFormDefault="unqualified" version="1.0">
<xsd:simpleType name="InputFormatList">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="BINARY"/>
<xsd:enumeration value="STRING"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="LevelTypeList">
<xsd:restriction base="xsd:string">
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="SchemeNameList">
<xsd:restriction base="xsd:string">
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ModeList">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="EXTRACT"/>
<xsd:enumeration value="FORMAT"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="CompactionMethodList">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="32-bit"/>
<xsd:enumeration value="16-bit"/>
<xsd:enumeration value="8-bit"/>
<xsd:enumeration value="7-bit"/>
<xsd:enumeration value="6-bit"/>
<xsd:enumeration value="5-bit"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="PadDirectionList">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="LEFT"/>
<xsd:enumeration value="RIGHT"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:complexType name="Field">
<xsd:attribute name="seq" type="xsd:integer" use="required"/>
<xsd:attribute name="name" type="xsd:string" use="required"/>
<xsd:attribute name="bitLength" type="xsd:integer"/>
<xsd:attribute name="characterSet" type="xsd:string" use="required"/>
<xsd:attribute name="compaction" type="tdt:CompactionMethodList"/>
<xsd:attribute name="compression" type="xsd:string"/>
<xsd:attribute name="padChar" type="xsd:string"/>
<xsd:attribute name="padDir" type="tdt:PadDirectionList"/>
<xsd:attribute name="decimalMinimum" type="xsd:long"/>
<xsd:attribute name="decimalMaximum" type="xsd:long"/>
<xsd:attribute name="length" type="xsd:integer"/>
</xsd:complexType>
<xsd:complexType name="Option">
<xsd:sequence>
<xsd:element name="field" type="tdt:Field" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="optionKey" type="xsd:string" use="required"/>
<xsd:attribute name="pattern" type="xsd:string"/>
<xsd:attribute name="grammar" type="xsd:string" use="required"/>
</xsd:complexType>
<xsd:complexType name="Rule">
<xsd:attribute name="type" type="tdt:ModeList" use="required"/>
<xsd:attribute name="inputFormat" type="tdt:InputFormatList" use="required"/>
<xsd:attribute name="seq" type="xsd:integer" use="required"/>
<xsd:attribute name="newFieldName" type="xsd:string" use="required"/>
<xsd:attribute name="characterSet" type="xsd:string" use="required"/>
<xsd:attribute name="padChar" type="xsd:string"/>
<xsd:attribute name="padDir" type="tdt:PadDirectionList"/>
<xsd:attribute name="decimalMinimum" type="xsd:long"/>
<xsd:attribute name="decimalMaximum" type="xsd:long"/>
<xsd:attribute name="length" type="xsd:string"/>
<xsd:attribute name="function" type="xsd:string" use="required"/>
<xsd:attribute name="tableURI" type="xsd:string"/>
<xsd:attribute name="tableParams" type="xsd:string"/>
<xsd:attribute name="tableXPath" type="xsd:string"/>
<xsd:attribute name="tableSQL" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="Level">
<xsd:sequence>
<xsd:element name="option" type="tdt:Option" minOccurs="1"
maxOccurs="unbounded"/>
<xsd:element name="rule" type="tdt:Rule" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="type" type="tdt:LevelTypeList" use="required"/>
<xsd:attribute name="prefixMatch" type="xsd:string"/>
<xsd:attribute name="requiredParsingParameters" type="xsd:string"/>
<xsd:attribute name="requiredFormattingParameters" type="xsd:string"/>
</xsd:complexType>
<xsd:complexType name="Scheme">
<xsd:sequence>
<xsd:element name="level" type="tdt:Level" minOccurs="4" maxOccurs="5"/>
</xsd:sequence>
<xsd:attribute name="name" type="tdt:SchemeNameList" use="required"/>
<xsd:attribute name="optionKey" type="xsd:string" use="required"/>
</xsd:complexType>
<xsd:complexType name="TagDataTranslation">
<xsd:sequence>
<xsd:element name="scheme" type="tdt:Scheme" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="version" type="xsd:string" use="required"/>
<xsd:attribute name="date" type="xsd:dateTime" use="required"/>
</xsd:complexType>
<xsd:element name="TagDataTranslation" type="tdt:TagDataTranslation"/>
</xsd:schema>