サポートされるリッチ問合せ構文

Oracle Blockchain Platformでは、SQLリッチ問合せとCouchDBリッチ問合せの2種類のリッチ問合せ構文がサポートされ、状態データベースの問合せに使用できます。

SQLリッチ問合せ構文

Berkeley DB JSON拡張は、SQL関数の形式をとっています。

始める前に

次の点に注意してください。

  • 問合せの実行元のチャネル・チェーンコード(<STATE>)にのみアクセスできます。

  • SELECT文のみがサポートされます。

  • 状態データベース表を変更できません。

  • リッチ問合せ式には、SELECT文を1つのみ指定できます。

  • このトピックの例は、リッチ問合せを作成できる方法をいくつか示したにすぎません。通常の完全なSQL構文にアクセスして、SQLデータベースに問合せできます。

  • JSON1拡張(SQLite拡張)にアクセスできます。『JSON1 Extension』および『SQL As Understood by SQLite』を参照してください。

チェーンコードの記述およびテストの詳細は、「チェーンコードの開発」を参照してください。

問合せにおける状態データベースの参照方法

状態データベース表の名前は、Oracle Blockchain Platformによって内部的に管理されるため、チェーンコードの記述時にデータベースの物理名を知っている必要はありません。

かわりに、<STATE>別名を使用して表名を参照する必要があります。たとえば、select key, value from <STATE>です。

<STATE>別名では、大/小文字が区別されないため、<state><STATE>または<StAtE>などを使用できます。

すべてのキーの取得

次の構文を使用します:

SELECT key FROM <STATE>

たとえば、この構文を使用してCar Dealerサンプルを問い合せると、次のキーのリストが取得されます:

キー

abg1234

abg1235

ser1236

bra1238

dtrt10001

すべてのキーと値を取得し、キーのアルファベット順に並替え

次の構文を使用します:

SELECT key AS serialNumber, valueJson AS details FROM  <state> ORDER BY key

たとえば、この構文を使用してCar Dealerサンプルを問い合せると、次の結果が得られます:

serialNumber 詳細
abg1234 {"docType": "vehiclePart", "serialNumber": "abg1234", "assembler": "panama-parts", "assemblyDate": 1502688979, "name": "airbag 2020", "owner": "Detroit Auto", "recall": false, "recallDate": 1502688979}
abg1235 {"docType": "vehiclePart", "serialNumber": "abg1235", "assembler": "panama-parts", "assemblyDate": 1502688979, "name": "airbag 4050", "owner": "Detroit Auto", "recall": false, "recallDate": 1502688979}
bra1238 {"docType": "vehiclePart", "serialNumber": "bra1238", "assembler": "bobs-bits", "assemblyDate": 1502688979, "name": "brakepad 4200", "owner": "Detroit Auto", "recall": false, "recallDate": 1502688979}
dtrt10001 {"docType": "vehicle", "chassisNumber": "dtrt10001", "manufacturer": "Detroit Auto", "model": "a coupe", "assemblyDate": 1502688979, "airbagSerialNumber": "abg1235", "owner": "Sam Dealer", "recall": false, "recallDate": 1502688979
ser1236 {"docType": "vehiclePart", "serialNumber": "ser1236", "assembler": "panama-parts", "assemblyDate": 1502688979, "name": "seatbelt 10020", "owner": "Detroit Auto", "recall": false, "recallDate": 1502688979}

"abg"で始まるすべてのキーと値の取得

次の構文を使用します:

SELECT key AS serialNumber, valueJson AS details FROM <state> WHERE key LIKE 'abg%'SELECT key, value FROM <STATE>

たとえば、この構文を使用してCar Dealerサンプルを問い合せると、次の結果が得られます:

serialNumber 詳細
abg1234 {"docType": "vehiclePart", "serialNumber": "abg1234", "assembler": "panama-parts", "assemblyDate": "1502688979", "name": "airbag 2020", "owner": "Detroit Auto", "recall": "false", "recallDate": "1502688979"}
abg1235 {"docType": "vehiclePart", "serialNumber": "abg1235", "assembler": "panama-parts", "assemblyDate": "1502688979", "name": "airbag 4050", "owner": "Detroit Auto", "recall": "false", "recallDate": "1502688979"}

"Detroit Auto"が所有する自動車部品を含む値を持つすべてのキーの取得

次の構文を使用します:

SELECT key FROM <state> WHERE json_extract(valueJson, '$.docType') = 'vehiclePart' AND json_extract(valueJson, '$.owner') = 'Detroit Auto'

たとえば、この構文を使用してCar Dealerサンプルを問い合せると、次のキーのリストが取得されます:

キー

abg1234

abg1235

ser1236

bra1238

"Sam Dealer"が所有するすべての自動車のモデルと製造元の取得

次の構文を使用します:

SELECT json_extract(valueJson, '$.model') AS model, json_extract(valueJson, '$.manufacturer') AS manufacturer FROM <state> WHERE json_extract(valueJson, '$.docType') = 'vehicle' AND json_extract(valueJson, '$.owner') = 'Sam Dealer'

たとえば、この構文を使用してCar Dealerサンプルを問い合せると、次の結果が得られます:

モデル 製造元
a coupe Detroit Auto

CouchDBリッチ問合せ構文

CouchDB構文を含むチェーンコードをOracle Blockchain Platformに移行する場合、またはOracle Blockchain Platformネットワークに参加しているHyperledger Fabricピアにインストールするチェーンコードを記述する必要がある場合、このトピックの情報を使用します。

新しいチェーンコードを記述する場合、SQLリッチ問合せを使用し、Oracle Blockchain PlatformとBerkeley DBの組合せで得られるパフォーマンス上の利点を活用することをお薦めします。

チェーンコードの記述およびテストの詳細は、「チェーンコードの開発」を参照してください。

サポートされていない問合せパラメータおよびセレクタ構文

Oracle Blockchain Platformでは、use_indexパラメータはサポートされていません。これを使用した場合、Oracle Blockchain Platformではこのパラメータが無視され、問題のStateDBに定義されている索引が自動的に選択されます。

パラメータ タイプ 説明
use_index json 特定の索引を使用するように問合せに指示します。

自動車のすべてのモデル、製造元および所有者の取得と所有者による並替え

次の式を使用します:

{ 
  "fields": ["model", "manufacturer", "owner"], 
  "sort": [   
    "owner" 
   ]
}

"Sam Dealer"が所有するすべての自動車のモデルと製造元の取得

次の式を使用します:

{ 
  "fields": ["model", "manufacturer"], 
  "selector": {   
    "docType"  : "vehicle",
     "owner" : "Sam Dealer" 
  }
}