oracle数据库的预定义的对象类型

简介: Oracle9i release1 提供了很多有用的,预定义的类型。 类型 描述 xmltype 存储和操作xml数据 多种uri类型 使用这些存储和处理uri(全球统一资源定位), 如根据html 地址获得web 页面 多种any类型 用来定义xml变量并且处理各种类型 都是sys 用户创建的,创建这些类型的脚本:$ORACLE_HOME/rdbms/admin 13.5.1 xmltype Oracle 9i release1 引入了对象类型xmltype。


Oracle9i release1 提供了很多有用的,预定义的类型。
类型 描述
xmltype 存储和操作xml数据
多种uri类型 使用这些存储和处理uri(全球统一资源定位),
如根据html 地址获得web 页面
多种any类型 用来定义xml变量并且处理各种类型
都是sys 用户创建的,创建这些类型的脚本:$ORACLE_HOME/rdbms/admin
13.5.1 xmltype
Oracle 9i release1 引入了对象类型xmltype。在oracle 9i release1 中使用xmltype必须加
前缀sys。在oracle 9i release2 之后不需要。
要使用xmltype必须要了解两件事请:
1. 它是一个oracle内置的对象类型。可以用在table的列上,也可以在plsql中作为变量的
类型来使用。
2. xquery,oracle查找和建立xml 文档的语言。在oracle 10g release2。
当然,我们还需要对xml 很熟悉,如基本概念,xpath等。
/**
使用和操作xmltype
**/
create table falls(
fall_id number,
fall xmltype
);
--使用xmltype的静态方法createxml插入xml数据
INSERT INTO falls VALUES (1, XMLType.CreateXML(
'<?xml version="1.0"?>
<fall>
<name>Munising Falls</name>
<county>Alger</county>

<state>MI</state>
<url>
http://michiganwaterfalls.com/munising_falls/munising_falls.html
</url>
</fall>'));
INSERT INTO falls VALUES (2, XMLType.CreateXML(
'<?xml version="1.0"?>
<fall>
<name>Au Train Falls</name>
<county>Alger</county>
<state>MI</state>
<url>
http://michiganwaterfalls.com/autrain_falls/autrain_falls.html
</url>
</fall>'));
INSERT INTO falls VALUES (3, XMLType.CreateXML(
'<?xml version="1.0"?>
<fall>
<name>Laughing Whitefish Falls</name>
<county>Alger</county>
<state>MI</state>
</fall>'));
类型xmltype中内置了很多静态方法可以用来操作xml,具体地可以在plsqldeveloper中的
type栏目中查找xmltype。
插入的时候调用xmltype的createxml方法。下面的是静态方法existsNode的两种用法。
select fall_id from falls f where f.fall.existsNode('/fall/url')>0;--存在fall/url
select fall_id from falls where existsNode(fall,'/fall/url')>0;--fall列中存在fall下面有url的
在plsql中使用,并获得指定字符,采用静态方法extract:
--在plqldev中运行报错,在sqlplus中正确
<<demo_block>>
DECLARE
fall XMLType;
url VARCHAR2(100);
BEGIN
--将xml查询出来放入变量中
SELECT fall INTO demo_block.fall
FROM falls f
WHERE f.fall_id = 1;
--抽取xml文档,并获得指定字符
url := fall.extract('/fall/url/text( )').getStringVal;

DBMS_OUTPUT.PUT_LINE(url);
END;
注:fall.extract('/fall/url/text( )').getStringVal 调用静态方法extract提取相应数据,也就是
提供根目录下的url子目录下的文本,text()指url的体部文本。geteStringVal是文本的值。
select Upper(Xmltype.getStringVal(xmltype.extract(fall,'/fall/url/text()'))) from falls
where existsNode(fall,'/fall/url')>0;
上面的是将查询出来的html 地址变为大写。更多请参考具体资料和类型定义。
13.5.2 URI types
Uri类型是专门存储和处理uri(全球统一资源定位)的,如http地址。那么有三种子类型:
HttpuriType:和http相关的uri,如指向一个web 页面。(根据uri得到整个web 页面)
dburiType:支持具有xpath表达式的url
XdburiType:支持url和引用oracle xml db对象。Xml db对象是oracle内置的xml技术的集
合。
在oracle 9i release1 中需要指定前缀sys,在oracle 9i release2 中不需要。
-- user uritype
DECLARE
WebPageURL HttpUriType;
WebPage CLOB;
BEGIN
--建立一个uritype的实例,调用静态方法createuri,根据传入的uri获得整个页面,这样就获得了整个
www.163.com的页面
WebPageURL := HttpUriType.createUri(
'http://www.163.com');
--获得web页面的clob
WebPage := WebPageURL.getclob( );
--显示web页面中的指定字符
DBMS_OUTPUT.PUT_LINE((SUBSTR(WebPage,1,500)));
END;
结果是:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>网易</title>
<base target="_blank" />
<meta name="Keywords" content="网易,新闻,体育,娱乐,女性,旅游,文化,论坛,短信,数码,汽
车,手机,财经,科技" />

<meta name="Description" content="网易,新闻,体育,娱乐,女性,旅游,文化,论坛,短信,数码,
汽车,手机,财经,科技,专业报道门户网站" />
<meta name="robo
13.5.3 Any types
Oracle 9i release1 允许你操作数据不知道它的类型知道运行期知道。这就是anytype,下
面的都属于anytype一族:
类型 描述
anydata 处理anytype的单个值。内置的标量,用户定
义的对象类型,nested table,lob,varray,以
及其他不在上面列表中的类型。
anydataset 获得anytype值的集合。以及相同类型的所有
值。
anytype 获得一个type的描述,是anydata,而不是
data。
在oracle 9i release1 使用要加sys,以后的版本不需要加。也就是是sys 用户创建的。
除了创建anytype之外,dbmsany.sql还创建了dbms_types 包。它里面有一系列的常量,能
够决定创建的anytype在运行期指定的类型。
TYPECODE_DATE
TYPECODE_NUMBER
TYPECODE_RAW
TYPECODE_CHAR
TYPECODE_VARCHAR2
TYPECODE_VARCHAR
TYPECODE_MLSLABEL
TYPECODE_BLOB
TYPECODE_BFILE
TYPECODE_CLOB
TYPECODE_CFILE
TYPECODE_TIMESTAMP
TYPECODE_TIMESTAMP_TZ
TYPECODE_TIMESTAMP_LTZ
TYPECODE_INTERVAL_YM
TYPECODE_INTERVAL_DS
TYPECODE_REF
TYPECODE_OBJECT
TYPECODE_VARRAY
TYPECODE_TABLE
TYPECODE_NAMEDCOLLECTION
TYPECODE_OPAQUE
Oracle pl/sql programming应用程序开发指南 mailto:dingjunlove@163.com
第 99 页 共 105 页 99
CREATE OR REPLACE TYPE waterfall AS OBJECT (
name VARCHAR2(30),
height NUMBER
);
CREATE OR REPLACE TYPE river AS OBJECT (
name VARCHAR2(30),
length NUMBER
);
DECLARE
TYPE feature_array IS VARRAY(2) OF SYS.AnyData;
features feature_array;
wf waterfall;
rv river;
ret_val NUMBER;
BEGIN
--Create an array where each element is of
--a different object type
features := feature_array(
AnyData.ConvertObject(
waterfall('Grand Sable Falls',30)),
AnyData.ConvertObject(
river('Manistique River', 85.40))
);
--Display the feature data
FOR x IN 1..features.COUNT LOOP
--Execute code pertaining to whatever object type
--we are currently looking at. NOTE! Replace GENNICK
--with whatever schema you are using.
CASE features(x).GetTypeName
--类型钱要加创建此类型的schema
WHEN 'DINGJUN123.WATERFALL' THEN
ret_val := features(x).GetObject(wf);
DBMS_OUTPUT.PUT_LINE('Waterfall: '
|| wf.name || ', Height = ' || wf.height || ' feet.');
WHEN 'DINGJUN123.RIVER' THEN
ret_val := features(x).GetObject(rv);
DBMS_OUTPUT.PUT_LINE('River: '
|| rv.name || ', Length = ' || rv.length || ' miles.');
END CASE;
END LOOP;
END;
Oracle pl/sql programming应用程序开发指南 mailto:dingjunlove@163.com
第 100 页 共 105 页 100
结果是:
Waterfall: Grand Sable Falls, Height = 30 feet.
River: Manistique River, Length = 85.4 miles.
其中
features := feature_array(
AnyData.ConvertObject(
waterfall('Grand Sable Falls',30)),
AnyData.ConvertObject(
river('Manistique River', 85.40))
);
初始化anydata。AnyData.ConvertObject转为anydata。
features(x).GetTypeName获得真正的类型名。
当我们获得了类型之后,就需要调用下面这句来获得指定的对象。这样wf就可以获得
anydata 的值了。
ret_val := features(x).GetObject(wf);


相关文章
|
5天前
|
Oracle 关系型数据库 Java
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
实时计算 Flink版操作报错之读取Oracle数据库时遇到找不到驱动,是什么原因
|
10天前
|
Oracle 关系型数据库 MySQL
实时计算 Flink版操作报错合集之采集oracle的时候报ORA-65040:不允许从可插入数据库内部执行该操作如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
34 3
|
5天前
|
Oracle 关系型数据库 数据库
实时计算 Flink版产品使用合集之采集Oracle数据库时,归档日志大小暴增的原因是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之从Oracle数据库同步数据时,checkpoint恢复后无法捕获到任务暂停期间的变更日志,如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之如何SQL同步数据到Oracle数据库中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
5天前
|
Oracle 关系型数据库 数据库
实时计算 Flink版产品使用合集之Oracle归档日志一天就达到了15GB并导致数据库崩溃,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
11天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之可以通过配置Oracle数据库的schema注册表来监测表结构的变化吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
20 1
|
SQL Oracle 关系型数据库
修改oracle数据库字符集
修改oracle数据库字符集
|
SQL Oracle 关系型数据库
oracle修改本机上数据库字符集
oracle修改本机上数据库字符集
|
SQL Oracle 关系型数据库
Oracle 数据库-服务器端字符集查看方法
Oracle 数据库-服务器端字符集查看方法
173 0
Oracle 数据库-服务器端字符集查看方法

推荐镜像

更多