IDU リクエスト¶
データのクエリだけでなく、RESTful Web サービスを使用して、ビューに対する IDU (Insert、Delete、および Update) 操作を実行することもできます。ビューに対して IDU 操作を実行するには、ビューが「更新可能」である必要があります。『VQL ガイド』の「 ビューに対する挿入、更新および削除 」のセクションでは、ビューがどのような場合に「更新可能」なのかを説明しています。
RESTful 規則に従い、サービスによって Virtual DataPort に送信されるステートメントはリクエストの 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-Type
は application/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_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
リクエストの本文:
<?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_field1
とspecific_field2
) に属性xsi:nil="true"
を追加します。
サービスが実行する INSERT ステートメントは、JSON 本文を送信する場合と同じです。
1 行を挿入するリクエストの本文の代替構造¶
上記のテキストは、1 行以上を挿入するリクエストの本文の構造に関する説明です。1 行を挿入するための代替構造があります。これは、Denodo 6.0 の REST Web サービスでサポートされていた構造です。Denodo 7.0 以降でも上記の構文はサポートされており、1 回のリクエストで 1 行または複数行を挿入できる新しい構文の使用をお勧めします。
以下の例は、ビューに 1 行を挿入するための、リクエストの古い本文を示しています。どちらの例でも同じようにデータが送信されます (一方は JSON、もう一方は XML で)。
例 1 (JSON)
リクエストの本文:
{
"iinc_id": 2000
, "summary": "New incidence"
, "taxid": "B99999999"
, "specific_field1": null
, "specific_field2": null
}
例 2 (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_field1
とspecific_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
リクエストの本文:
{
"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
リクエストの本文:
<?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 ヘッダーの Accept
と Content-Type
を追加する必要がない点が、 POST
リクエストと PUT
リクエストとは異なります。