使用SQL*Loader加载对象

来源:互联网 发布:sql union all用法 编辑:程序博客网 时间:2024/04/29 02:29
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

SQL*Loader是一种无需编写复杂代码就可以将数据导入数据库的快速方式。然而,当涉及到彼此相互关联的Oracle对象时,使用SQL*Loader实现过程变得有些麻烦,而且这方面的文章也讲述得含糊不清。这里提供了两个例子,以帮助你理解如何使用SQL*Loader加载对象

SQL*Loader是一种无需编写冗长、复杂代码就可以将数据导入数据库的快速简洁方式。然而,当涉及到彼此相互关联的Oracle对象时,使用SQL*Loader实现过程变得有些麻烦,而且这方面的文章也讲述得含糊不清。这里提供了这方面的两个例子:其中一个为有关系统生成的Oracle Internet Directories (OIDs),另一个为有关用户自定义的OIDs。

首先,让我们开始于一些简单的对象:描述三个人之间的家谱关系,可见于"../../../../traslation05670608long0608long%22%20l">ListingA。如果我们想使用SQL*Loader将数据输出到一个文本文件,我们需要导出系统生成的OID。帮助文档没有提到可以使用隐藏栏SYS_NC_OID$来提取OID。从一个对象表中选择这一column将返回16位RAW OID,即通过SQL*Plus自动转化为32位的16进制字符。你可以使用以逗号分隔的SQL*Loader文件中的栏重新建立对象以及它们的关系。

查看Listing B,可以看到,column“sysid”为一个对象OID的虚拟栏。SQL*Loader控制文件语法“oid(sysid)”并传递给对象。查看Listing C这里,引用(references)通过虚拟域“groom_id”和“bride_id”来确定,且将引用(references)构建到PEOPLE表中。这一过程等效于从一个SQLINSERT语句中使用make_ref(people,hextoraw(:oid))。

使用SYS_NC_OID$存在一个主要的问题,即它几乎不能隐藏栏,而且需要多次提示开发人员不应该依赖于这一数据类型,尤其当数据库版本改变之后。

如果你以对象方式输出一个表格,你可以看到被导出的SQL将数据插入到栏中。而且更好的方法是输出OID到标准的SQL类型。这些过程将会产生外部程序的限制数量,而这些外部程序可以存储开发语言(PL/SQL, Java, OCI, and OO4O)的对象。而且,开发人员也会依赖于主键和用户自定义的OID来传递Reference。

现在让我们使用一个简单的整数顺序来说明用户自定义的OID。一个用户自定义OID可以为任何数据类型,只要在表格中唯一即可,并且最好为全局唯一的。你可以使用SYS_GUID()生成全局唯一的ID,而使用整数顺序可以使得程序可具可读性。请注意,用户自定义OID必须是有范围。如果你没有对References限制范围化,程序会为这一对象使用系统生成的OID。如果你通过一个非范围References使用用户自定义OID,你将会返回一个ORA-22979。

Listing D包含用户自定义OID的最新表格定义。"../../../../traslation05670608long0608long%22%20l">ListingE包含一些控制文件,用于使用OID而不是通过数据库生成方式而更新Reference对象。

责任编辑:"mailto:li_ning@zdnet.com.cn?subject=http://www.zdnet.com.cn/developer/database/story/0,3800066906,39385077,00.htm">李宁

欢迎"mailto:li_ning@zdnet.com.cn?subject=投稿:(稿件题目)">投稿<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击