USER MANUALS

IDU リクエスト

データのクエリだけでなく、RESTful Web サービスを使用して、ビューに対する IDU (Insert、Delete、および Update) 操作を実行することもできます。ビューに対して IDU 操作を実行するには、ビューが「更新可能」である必要があります。『VQL ガイド』の「 ビューに対する挿入、更新および削除 」のセクションでは、ビューがどのような場合に「更新可能」なのかを説明しています。

RESTful 規則に従い、サービスによって Virtual DataPort に送信されるステートメントはリクエストの HTTP メソッドに依存します。

RESTful Web サービス: IDU 操作の HTTP メソッド

HTTP メソッド

リクエストの URL の構文

サービスが実行する SQL ステートメント

POST

/denodo-restfulws/<database name>/views/<view name>

INSERT

PUT

/denodo-restfulws/<database name>/views/<view name>/<primary key value>

UPDATE

DELETE

/denodo-restfulws/<database name>/views/<view name>/<primary key value>

DELETE

POST リクエストと PUT リクエストでは、ビューで挿入または変更するデータをその本文に記述する必要があります。これらのデータは JSON ドキュメントまたは XML ドキュメントとして表現できます。ドキュメントのタイプに応じて、HTTP ヘッダー Content-Typeapplication/json または application/xml のどちらかにする必要があります。

どちらのタイプのドキュメントでも、 timestamptz 型の値は、 yyyy-MM-dd'T'hh:mm:ssZ 形式で記述する必要があります。たとえば、 2005-06-29T17:19:41+0000 と指定します。

INSERT クエリ (POST)

ビューに 1 つ以上の行を挿入するには、ビューを表す URL (/denodo-restfulws/<database name>/views/<view name>) に POST リクエストを送信します。たとえば、ビューの名前が「incidence」の場合、URL は以下のようになります。

https://denodo-server.acme.com:9443/denodo-restfulws/admin/views/incidence

サービスがこのリクエストを受け取ると、 INSERT ステートメントを実行します。ステートメントが正常に終了すると、サービスは HTTP コード 201 ("Created") を返します。ビューにプライマリキーがあり、1 行だけ挿入するリクエストの場合、応答には新しい行を指し示す URL を含む HTTP ヘッダー “Location” も含まれます。

以下に、複数行を挿入するリクエストの例を 2 つ示します。どちらの例でも同じようにデータが送信されます (最初の例では JSON、2 番目の例では XML のドキュメントとして)。これらは複数行を挿入する場合の例ですが、1 行だけ挿入する場合にも同じ方法を使用できます。

例 1 (JSON)

  • URL: https://denodo-server.acme.com:9443/denodo-restfulws/admin/views/incidence

  • HTTP メソッド: POST

  • HTTP ヘッダー:

    Accept: application/json
    Content-Type: application/json
    
  • リクエストの本文:

ビュー「employee」に 3 行挿入するリクエスト (JSON リクエスト) の本文
[
      {
             "employee_id": 9999,
             "first_name": "Peter",
             "last_name": "Jackson",
             "email": "pjackson",
             "hire_date": "2016-01-24",
             "job_id": "AD_PRES",
             "phone_number": "515.123.8181"
      },
      {
             "employee_id": 10000,
             "first_name": "Christopher",
             "last_name": "Nolan",
             "email": "cnolan",
             "hire_date": "2016-01-22",
             "job_id": "AD_PRES",
             "department_id": null
      },
      {
             "employee_id": 10001,
             "first_name": "Steven",
             "last_name": "Spielberg",
             "email": "sspielberg",
             "hire_date": "2016-01-25",
             "job_id": "AD_PRES",
             "salary": null
      }
]

サービスがこのリクエストを受け取ると、以下のクエリが実行されます。

INSERT INTO employee
    (employee_id, first_name, last_name, email, hire_date, job_id, phone_number, department_id)
VALUES
  ( 9999, 'Peter', 'Jackson', 'pjackson', DATE '2016-01-24', 'AD_PRES', '515.123.8181', null)
, ( 10000, 'Christopher', 'Nolan', 'cnolan', DATE '2016-01-22', 'AD_PRES', null, null)
, ( 10001, 'Steven', '', 'sspielberg', DATE '2016-01-26', 'AD_PRES', null, null)

あるフィールドが少なくとも 1 つの行に存在する場合、そのフィールドの値は、値を指定しない INSERT ステートメントの他の行で NULL に設定されます。たとえば、 phone_number は最初の行にのみ存在しますが、すべての新しい行のフィールドの数は同じでなければならないため、サービスはそのフィールドに NULL を設定します。

例 2 (XML)

  • URL: https://denodo-server.acme.com:9443/denodo-restfulws/admin/views/employee

  • HTTP メソッド: POST

  • HTTP ヘッダー:

    Accept: application/xml
    Content-Type: application/xml
    
  • リクエストの本文:

ビュー「employee」に 3 行挿入するリクエスト (XML リクエスト) の本文
<?xml version="1.0" encoding="UTF-8"?>
<view name="employee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <employee>
             <employee_id>9999</employee_id>
             <first_name>Peter</first_name>
             <last_name>Jackson</last_name>
             <email>pjackson</email>
             <hire_date>2016-01-24</hire_date>
             <job_id>AD_PRES</job_id>
             <phone_number>515.123.8181</phone_number>
     </employee>
     <employee>
             <employee_id>10000</employee_id>
             <first_name>Christopher</first_name>
             <last_name>Nolan</last_name>
             <email>cnolan</email>
             <hire_date>2016-01-22</hire_date>
             <job_id>AD_PRES</job_id>
             <phone_number xsi:nil="true"/>
             <department_id xsi:nil="true"/>
     </employee>
     <employee>
             <employee_id>10001</employee_id>
             <first_name>Steven</first_name>
             <last_name>Spielberg</last_name>
             <email>sspielberg</email>
             <hire_date>2016-01-26</hire_date>
             <phone_number/>
             <job_id>AD_PRES</job_id>
     </employee>
</view>

考慮事項:

  • ルートエレメントの名前は「view」とし、データを挿入するビューの名前を値とする属性「name」を指定する必要があります。

  • 挿入する行ごとに、ビューの名前を付けたエレメントを 1 つ追加します。この例では、「<employee>」となります。

  • INSERT ステートメントで値に NULL を割り当てるには、名前空間 http://www.w3.org/2001/XMLSchema-instance を定義し、必要なフィールド (この例では specific_field1specific_field2 ) に属性 xsi:nil="true" を追加します。

サービスが実行する INSERT ステートメントは、JSON 本文を送信する場合と同じです。

1 行を挿入するリクエストの本文の代替構造

上記のテキストは、1 行以上を挿入するリクエストの本文の構造に関する説明です。1 行を挿入するための代替構造があります。これは、Denodo 6.0 の REST Web サービスでサポートされていた構造です。Denodo 7.0 以降でも上記の構文はサポートされており、1 回のリクエストで 1 行または複数行を挿入できる新しい構文の使用をお勧めします。

以下の例は、ビューに 1 行を挿入するための、リクエストの古い本文を示しています。どちらの例でも同じようにデータが送信されます (一方は JSON、もう一方は XML で)。

例 1 (JSON)

リクエストの本文:

ビュー「incidence」に 1 行挿入するリクエスト (JSON リクエスト) の本文
{
    "iinc_id": 2000
  , "summary": "New incidence"
  , "taxid": "B99999999"
  , "specific_field1": null
  , "specific_field2": null
}

例 2 (XML)

リクエストの本文:

ビュー「incidence」に 1 行挿入するリクエスト (XML リクエスト) の本文
<?xml version="1.0" encoding="UTF-8"?>
<incidence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <iinc_id>2000</iinc_id>
    <summary>New incidence</summary>
    <taxid>B99999999</taxid>
    <specific_field1 xsi:nil="true" />
    <specific_field2 xsi:nil="true" />
</incidence>

考慮事項:

  • ルートエレメントの名前にはビューの名前を使用します。

  • 値に NULL を割り当てるには、名前空間 http://www.w3.org/2001/XMLSchema-instance を定義し、明示的に NULL に設定するフィールド (この例では specific_field1specific_field2 ) に属性 xsi:nil="true" を追加します。

UPDATE クエリ (PUT)

行の値を変更するには、 ビューの行 を表す URL (/denodo-restfulws/<database name>/views/<view name>/<primary key values>) に PUT リクエストを送信します。たとえば、ビューの名前が「incidence」の場合、URL は以下のようになります。

https://denodo-server.acme.com:9443/denodo-restfulws/admin/views/incidence/12

この URL の末尾のセグメント (12) はプライマリキーの値です。 incidence ビューでは、 IINC_ID フィールドがプライマリキーです。

サービスがこのリクエストを受け取ると、 UPDATE ステートメントが実行されます。ステートメントが正常に完了すると、サービスは HTTP コード 204 (No content) を返します。

サービスでは、プライマリキーの値を使用して削除対象の行が特定されるので、プライマリキーがないビューの行を RESTful Web サービスを使用して更新することはできません。

プライマリキーが複数のフィールドで構成されている場合、各フィールドの値をカンマ (,) で区切ります。プライマリキーの値のいずれかに「,」が使用されている場合は、プライマリキー値の区切り文字として解釈されないように %2C でエンコードします。


以下に、2 つの同等の PUT (UPDATE) リクエストの例を示します。1 番目の例ではデータが XML ドキュメントで送信され、2 番目の例では JSON ドキュメントで送信されます。

例 1 (JSON)

  • URL: https://denodo-server.acme.com:9443/denodo-restfulws/admin/views/incidence/2

  • HTTP メソッド: PUT

  • HTTP ヘッダー:

    Accept: application/json
    Content-Type: application/json
    
  • リクエストの本文:

RESTful Web サービス: 本文を JSON 形式とした PUT リクエスト
{
  "summary": "Incident in ADSL router ..."
}

サービスがこのリクエストを受け取ると、以下のクエリが実行されます。

UPDATE incidence SET
    summary = 'Incident in ADSL router ...'
WHERE iinc_id = 2

WHERE 句は、プライマリキーのフィールド (IINC_ID) と URL 末尾のセグメントの値 (2) で構成されています。

例 2 (XML)

  • URL: https://denodo-server.acme.com:9443/denodo-restfulws/admin/views/incidence/2

  • HTTP メソッド: PUT

  • HTTP ヘッダー:

    Accept: application/xml
    Content-Type: application/xml
    
  • リクエストの本文:

ビュー incidence の XML の 1 行を変更するリクエストの本文
<?xml version="1.0" encoding="UTF-8"?>
<incidence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <summary>Incident in ADSL router ...</summary>
</incidence>

サービスがこのリクエストを受け取ると、JSON ドキュメントを受け取った場合と同じクエリが実行されます。

DELETE クエリ

ビューの行を削除するには、 ビューの行 を表す URL ( /denodo-restfulws/<database name>/views/<view name>/<primary key values>` ) に DELETE リクエストを送信します。たとえば、ビューの名前が「incidence」の場合、URL は以下のようになります。

https://denodo-server.acme.com:9443/denodo-restfulws/admin/views/incidence/12

この URL の末尾のセグメント (12) はプライマリキーの値です。 incidence ビューでは、 IINC_ID フィールドがプライマリキーです。

サービスがこのリクエストを受け取ると、 DELETE FROM <view> WHERE <primary key> のようなステートメントが実行されます。行が削除されると、サービスは HTTP コード 204 (No content) を返します。

サービスでは、プライマリキーの値を使用して削除対象の行が特定されるので、プライマリキーがないビューの行を RESTful Web サービスで削除することはできません。

複数の行を削除するには、削除する行ごとに 1 つのリクエストを送信します。

プライマリキーが複数のフィールドで構成されている場合、各フィールドの値をカンマ (,) で区切ります。プライマリキーの値のいずれかに「,」が使用されている場合は、プライマリキー値の区切り文字として解釈されないように %2C でエンコードします。

DELETE リクエストは、その本文が空であり、HTTP ヘッダーの AcceptContent-Type を追加する必要がない点が、 POST リクエストと PUT リクエストとは異なります。

Add feedback