
实验表:
create table xtab(
fid number,
fcontent xmltype
);
实验数据:
insert into xtab values(1,
xmltype.createxml(
'<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ms</val></item>' ||
'</items>');
************************************************
appendchildxml:
功能:增加xmltype对象的节点
语法:appendchildxml(xmltype,node_path,sub_xmltype)
node_path:表示要增加节点的上一层路径
sub_xmltype:增加的节点为一个xmltype对象
返回值:得到增加了节点后的xmltype对象
实验:增加xmltype对象的节点
procedure p10 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml(
'<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ibm</val></item>' ||
'</items>');
select appendchildxml(v_xml,'/items/item',
xmltype('<city>shenzhen</city>'))
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<items>
<item><id>1</id><val>oracle</val><city>shenzhen</city></item>
<item><id>2</id><val>ibm</val><city>shenzhen</city></item>
</items>
************************************************
deletexml:
功能:删除xmltype对象的某些节点
语法:deletexml(xmltype,node_path)
node_path:表示xml文件中某个节点的路径
返回值:得到删除了节点后的xmltype对象
实验:得到删除xmltype对象的某些节点后,新的xmltype对象
procedure p9 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml(
'<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ibm</val></item>' ||
'</items>');
select deletexml(v_xml,'/items/item/val')
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<items>
<item>
<id>1</id>
</item>
<item>
<id>2</id>
</item>
</items>
************************************************
existsnode:
功能:判断xmltype对象的某个节点是否存在
语法:existsnode(xmltype,node_path)
node_path:表示xml文件中某个节点的路径
返回值:1表示存在,0表示不存在
实验:查询某的xmltype字段是否有某个节点
select existsnode(x.fcontent,'/items/item') from xtab x;
实验:查看某个变量是否有某个节点
procedure p1 is
v_xml xmltype;
v_exists number;
begin
v_xml := xmltype('<items>' ||
' <item><id>1</id><val>apple</val></item>' ||
' <item><id>1</id><val>apple</val></item>' ||
'</items>');
select existsnode(v_xml, '/items/item/id') into v_exists from dual;
dbms_output.put_line(v_exists);
end;
实验输出:1
************************************************
extractvalue:
功能:得到xmltype对象某个节点的数值
语法:extractvalue(xmltype,node_path)
node_path:表示xml文件中某个节点的路径
注意:node_path路径在整个xmltype对象中必须是唯一的
返回值:得到该唯一节点的数值
实验:得到xmltype对象某个节点的数值
procedure p1 is
v_xml xmltype;
v_id number;
begin
v_xml := xmltype.createxml(
'<items>' ||
' <item><id >1</id><val>oracle</val></item>' ||
'</items>');
select to_number(extractvalue(v_xml,'/items/item/id'))
into v_id
from dual;
dbms_output.put_line(v_id);
end;
实验输出:1
************************************************
extract:
功能:得到xmltype对象某些节点的数值
语法:extract(xmltype,node_path)
node_path:表示xml文件中某个节点的路径
返回值:得到这些节点组成的xmltype对象
实验:得到xmltype对象某些节点的数值
procedure p1 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml(
'<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ibm</val></item>' ||
'</items>');
select extract(v_xml,'/items/item/val')
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<val>oracle</val>
<val>ibm</val>
************************************************
insertchildxml:
功能:增加xmltype对象的节点
语法:insertchildxml(xmltype,node_path,node_name,sub_xmltype)
node_path:表示要增加节点的上一层路径
node_name:表示要增加的节点的名称
sub_xmltype:增加的节点为一个xmltype对象
返回值:得到删除了节点后的xmltype对象
实验:增加xmltype对象的节点
procedure p10 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml(
'<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ibm</val></item>' ||
'</items>');
select insertchildxml(v_xml,'/items/item','city',
xmltype('<city>shenzhen</city>'))
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<items>
<item><id>1</id><val>oracle</val><city>shenzhen</city></item>
<item><id>2</id><val>ibm</val><city>shenzhen</city></item>
</items>
************************************************
insertchildxmlafter:
功能:向xmltype对象中某个层次节点之后增加一个元素
语法:insertchildxmlafter(xmltype,node_path,node, sub_xmltype)
node_path:添加元素节点的路径
node:添加元素节点的具体位置
sub_xmltype:表示添加的子元素节点
after:表示在指定的节点元素后面增加一个节点元素
实验:向xmltype对象中某个层次节点增加一个元素
procedure p1 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml(
'<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ibm</val></item>' ||
'</items>');
select insertchildxmlafter(v_xml,
'/items/item[2]',
'id',
xmltype('<city>shenzhen</city>'))
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<items>
<item><id>1</id><val>oracle</val></item>
<item><id>2</id><city>shenzhen</city><val>ibm</val></item>
</items>
************************************************
insertchildxmlbefore:
功能:向xmltype对象中某个层次节点之前增加一个元素
语法:insertchildxmlbefore(xmltype,node_path,node, sub_xmltype)
node_path:添加元素节点的路径
node:添加元素节点的具体位置
sub_xmltype:表示添加的子元素节点
after:表示在指定的节点元素后面增加一个节点元素
实验:向xmltype对象中某个层次节点之前增加一个元素
procedure p2 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml(
'<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ibm</val></item>' ||
' <item><id>3</id><val>ms</val></item>' ||
'</items>');
select insertchildxmlbefore(v_xml,
'/items/item[1]',
'id',
xmltype('<city>shenzhen</city>'))
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<items>
<item><city>shenzhen</city><id>1</id><val>oracle</val></item>
<item><id>2</id><val>ibm</val></item>
<item><id>3</id><val>ms</val></item>
</items>
************************************************
insertxmlafter:
功能:在指定节点后增加xmltype对象的节点
语法:insertxmlafter(xmltype,node_path,sub_xmltype)
node_path:表示要增加节点的上一层路径
sub_xmltype:增加的节点为一个xmltype对象
返回值:得到增加了节点后的xmltype对象
注意:通过下标来标示node_path表示的具体对象,该对象必须是一个可独立为xmltype对象的节点
实验:增加xmltype对象的节点
procedure p10 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml('<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ibm</val></item>' ||
'</items>');
select insertxmlafter(v_xml,
'/items/item[2]',
xmltype('<city>shenzhen</city>'))
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<items>
<item><id>1</id><val>oracle</val></item>
<item><id>2</id><val>ibm</val></item>
<city>shenzhen</city>
</items>
************************************************
insertxmlbefore:
功能:在指令节点前增加xmltype对象的节点
语法:insertxmlbefore(xmltype,node_path,sub_xmltype)
node_path:表示要增加节点的上一层路径
sub_xmltype:增加的节点为一个xmltype对象
返回值:得到增加了节点后的xmltype对象
注意:通过下标来标示node_path表示的具体对象,该对象必须是一个可独立为xmltype对象的节点
实验:增加xmltype对象的节点
procedure p3 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml('<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
' <item><id>2</id><val>ibm</val></item>' ||
' <item><id>3</id><val>ms</val></item>' ||
'</items>');
select insertxmlbefore(v_xml,
'/items/item[2]',
xmltype('<city>shenzhen</city>'))
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<items>
<item><id>1</id><val>oracle</val></item>
<city>shenzhen</city>
<item><id>2</id><val>ibm</val></item>
<item><id>3</id><val>ms</val></item>
</items>
************************************************
updatexml:
功能:更新xmltype对象某些节点的数值
语法:updatexml(xmltype,node_path,new_value)
node_path:表示xml文件中某个节点的路径
返回值:得到节点数值更新后的xmltype对象
实验:得到更新xmltype对象后某些节点的数值
procedure p8 is
v_xml xmltype;
v_val xmltype;
begin
v_xml := xmltype.createxml(
'<items>' ||
' <item><id>1</id><val>oracle</val></item>' ||
'</items>');
select updatexml(v_xml,'/items/item/val/text()','ms')
into v_val
from dual;
dbms_output.put_line(to_char(v_val.getclobval()));
end;
实验输出:
<items>
<item>
<id>1</id>
<val>ms</val>
</item>
</items>




