12 PL/SQLパッケージDBMS_XMLSTORE
PL/SQLパッケージDBMS_XMLSTORE
を使用して、オブジェクト・リレーショナル形式で格納されているXML文書でデータを挿入、更新または削除できます。これは、パッケージDBMS_XMLGEN
によって生成されるマッピングに類似した正規のXMLマッピングを使用します。これは、マッピングをオブジェクト・リレーショナルの構造体に変換し、対応する値をリレーショナル表で挿入、更新または削除します。
- DBMS_XMLSTOREパッケージの使用
コンテキスト・ハンドルを作成し、1つ以上の挿入、更新または削除を実行して、コンテキストを閉じます。 - DBMS_XMLSTOREを使用したXML文書の挿入
PL/SQLパッケージDBMS_XMLSTORE
を使用して、XML文書を表またはビューに挿入できます。これにより、文書が解析されて、値のバインド先のINSERT
文が作成されます。デフォルトでは、XML文書内の要素で表されるすべての列に値が挿入されます。 - DBMS_XMLSTOREを使用したXMLデータの更新
PL/SQLパッケージDBMS_XMLSTORE
を使用して、既存のデータを更新(変更)できます。行を識別するのにまとめて使用される列ごとにsetKeyColumn
プロシージャを1回ずつコールして、更新する行を指定します。(SQLでは、UPDATE
文のWHERE
句を使用して行を指定します。) - DBMS_XMLSTOREを使用したXMLデータの削除
PL/SQLパッケージDBMS_XMLSTORE
を使用して、既存のデータを削除できます。行を識別するのにまとめて使用される列ごとにsetKeyColumn
プロシージャを1回ずつコールして、削除する行を指定します。(SQLでは、UPDATE
文のWHERE
句を使用して行を指定します。)
親トピック: XMLType API
12.1 DBMS_XMLSTOREパッケージの使用
コンテキスト・ハンドルを作成し、1つ以上の挿入、更新または削除を実行して、コンテキストを閉じます。
PL/SQLパッケージDBMS_XMLSTORE
を使用するには、次のステップを実行します。
親トピック: PL/SQLパッケージDBMS_XMLSTORE
12.2 DBMS_XMLSTOREを使用したXML文書の挿入
PL/SQLパッケージDBMS_XMLSTORE
を使用して、XML文書を表またはビューに挿入できます。これにより、文書が解析されて、値のバインド先のINSERT
文が作成されます。デフォルトでは、XML文書内の要素で表されるすべての列に値が挿入されます。
例12-1では、DBM_XMLSTORE
を使用して、2人の新入社員に関する情報をemployees
表に挿入します。挿入する情報は、XMLデータとして提供されています。
例12-1 指定した列でのデータの挿入
SELECT employee_id AS EMP_ID, salary, hire_date, job_id, email, last_name
FROM employees WHERE department_id = 30;
EMP_ID SALARY HIRE_DATE JOB_ID EMAIL LAST_NAME
------ ---------- --------- ---------- ---------- ----------
114 11000 07-DEC-94 PU_MAN DRAPHEAL Raphaely
115 3100 18-MAY-95 PU_CLERK AKHOO Khoo
116 2900 24-DEC-97 PU_CLERK SBAIDA Baida
117 2800 24-JUL-97 PU_CLERK STOBIAS Tobias
118 2600 15-NOV-98 PU_CLERK GHIMURO Himuro
119 2500 10-AUG-99 PU_CLERK KCOLMENA Colmenares
6 rows selected.
DECLARE
insCtx DBMS_XMLSTORE.ctxType;
rows NUMBER;
xmlDoc CLOB :=
'<ROWSET>
<ROW num="1">
<EMPLOYEE_ID>920</EMPLOYEE_ID>
<SALARY>1800</SALARY>
<DEPARTMENT_ID>30</DEPARTMENT_ID>
<HIRE_DATE>17-DEC-2002</HIRE_DATE>
<LAST_NAME>Strauss</LAST_NAME>
<EMAIL>JSTRAUSS</EMAIL>
<JOB_ID>ST_CLERK</JOB_ID>
</ROW>
<ROW>
<EMPLOYEE_ID>921</EMPLOYEE_ID>
<SALARY>2000</SALARY>
<DEPARTMENT_ID>30</DEPARTMENT_ID>
<HIRE_DATE>31-DEC-2004</HIRE_DATE>
<LAST_NAME>Jones</LAST_NAME>
<EMAIL>EJONES</EMAIL>
<JOB_ID>ST_CLERK</JOB_ID>
</ROW>
</ROWSET>';
BEGIN
insCtx := DBMS_XMLSTORE.newContext('HR.EMPLOYEES'); -- Get saved context
DBMS_XMLSTORE.clearUpdateColumnList(insCtx); -- Clear the update settings
-- Set the columns to be updated as a list of values
DBMS_XMLSTORE.setUpdateColumn(insCtx, 'EMPLOYEE_ID');
DBMS_XMLSTORE.setUpdateColumn(insCtx, 'SALARY');
DBMS_XMLSTORE.setUpdateColumn(insCtx, 'HIRE_DATE');
DBMS_XMLSTORE.setUpdateColumn(insCtx, 'DEPARTMENT_ID');
DBMS_XMLSTORE.setUpdateColumn(insCtx, 'JOB_ID');
DBMS_XMLSTORE.setUpdateColumn(insCtx, 'EMAIL');
DBMS_XMLSTORE.setUpdateColumn(insCtx, 'LAST_NAME');
-- Insert the doc.
rows := DBMS_XMLSTORE.insertXML(insCtx, xmlDoc);
DBMS_OUTPUT.put_line(rows || ' rows inserted.');
-- Close the context
DBMS_XMLSTORE.closeContext(insCtx);
END;
/
2 rows inserted.
PL/SQL procedure successfully completed.
SELECT employee_id AS EMP_ID, salary, hire_date, job_id, email, last_name
FROM employees WHERE department_id = 30;
EMP_ID SALARY HIRE_DATE JOB_ID EMAIL LAST_NAME
------ ---------- --------- ---------- ---------- ----------
114 11000 07-DEC-94 PU_MAN DRAPHEAL Raphaely
115 3100 18-MAY-95 PU_CLERK AKHOO Khoo
116 2900 24-DEC-97 PU_CLERK SBAIDA Baida
117 2800 24-JUL-97 PU_CLERK STOBIAS Tobias
118 2600 15-NOV-98 PU_CLERK GHIMURO Himuro
119 2500 10-AUG-99 PU_CLERK KCOLMENA Colmenares
920 1800 17-DEC-02 ST_CLERK STRAUSS Strauss
921 2000 31-DEC-04 ST_CLERK EJONES Jones
8 rows selected.
親トピック: PL/SQLパッケージDBMS_XMLSTORE
12.3 DBMS_XMLSTOREを使用したXMLデータの更新
PL/SQLパッケージDBMS_XMLSTORE
を使用して、既存のデータを更新(変更)できます。行を識別するのにまとめて使用される列ごとにsetKeyColumn
プロシージャを1回ずつコールして、更新する行を指定します。(SQLでは、UPDATE
文のWHERE
句を使用して行を指定します。)
この列のセットは、キー列と同様に機能し、組み合せて使用することにより、更新する一意の行を指定します。ただし、(setKeyColumn
とともに)使用する列は、表内のキーである必要はありません。行を一意に指定するかぎり、setKeyColumn
へのコールとともに使用できます。
例12-2では、DBM_XMLSTORE
を使用して情報を更新します。この例では、従業員番号188の名前が誤って「Kelly」として記録されていると仮定し、この名前を「Pat」に訂正します。employee_id
列が、employees
表の主キーであるため、更新用に一意の行を識別するには、employee_id
列を指定するsetKeyColumn
への1回のコールで十分です。
次のUPDATE
文は、例12-2で使用されているDBM_XMLSTORE
と同等です。
UPDATE hr.employees SET first_name = 'Pat' WHERE employee_id = 188;
例12-2 キー列を使用したデータの更新
SELECT employee_id, first_name FROM employees WHERE employee_id = 188;
EMPLOYEE_ID FIRST_NAME
----------- ----------
188 Kelly
1 row selected.
DECLARE
updCtx DBMS_XMLSTORE.ctxType;
rows NUMBER;
xmlDoc CLOB :=
'<ROWSET>
<ROW>
<EMPLOYEE_ID>188</EMPLOYEE_ID>
<FIRST_NAME>Pat</FIRST_NAME>
</ROW>
</ROWSET>';
BEGIN
updCtx := DBMS_XMLSTORE.newContext('HR.EMPLOYEES'); -- get the context
DBMS_XMLSTORE.clearUpdateColumnList(updCtx); -- clear update settings
-- Specify that column employee_id is a "key" to identify the row to update.
DBMS_XMLSTORE.setKeyColumn(updCtx, 'EMPLOYEE_ID');
rows := DBMS_XMLSTORE.updateXML(updCtx, xmlDoc); -- update the table
DBMS_XMLSTORE.closeContext(updCtx); -- close the context
END;
/
SELECT employee_id, first_name FROM employees WHERE employee_id = 188;
EMPLOYEE_ID FIRST_NAME
----------- ----------
188 Pat
1 row selected.
親トピック: PL/SQLパッケージDBMS_XMLSTORE
12.4 DBMS_XMLSTOREを使用したXMLデータの削除
PL/SQLパッケージDBMS_XMLSTORE
を使用して、既存のデータを削除できます。行を識別するのにまとめて使用される列ごとにsetKeyColumn
プロシージャを1回ずつコールして、削除する行を指定します。(SQLでは、UPDATE
文のWHERE
句を使用して行を指定します。)
例12-3 DBMS_XMLSTORE.DELETEXMLの例
SELECT employee_id FROM employees WHERE employee_id = 188;
EMPLOYEE_ID
-----------
188
1 row selected.
DECLARE
delCtx DBMS_XMLSTORE.ctxType;
rows NUMBER;
xmlDoc CLOB :=
'<ROWSET>
<ROW>
<EMPLOYEE_ID>188</EMPLOYEE_ID>
<DEPARTMENT_ID>50</DEPARTMENT_ID>
</ROW>
</ROWSET>';
BEGIN
delCtx := DBMS_XMLSTORE.newContext('HR.EMPLOYEES');
DBMS_XMLSTORE.setKeyColumn(delCtx, 'EMPLOYEE_ID');
rows := DBMS_XMLSTORE.deleteXML(delCtx, xmlDoc);
DBMS_XMLSTORE.closeContext(delCtx);
END;
/
SELECT employee_id FROM employees WHERE employee_id = 188;
no rows selected.
親トピック: PL/SQLパッケージDBMS_XMLSTORE