首页 > 大数据 > 正文

Oracle数据提到文本文档进行查询的方法

2011-03-13 18:42:42  来源:TechTarget中国

摘要:以上的例子可以为你提供一定的参考,你可以修改路径和外部表定义来满足你的实际情况。希望能够成为你的最终解决方案。
关键词: Oracle 数据

    数据库中我运行了以下的查询语句:

Select PLAN_ID, EL_ID, NIIN, ITEM_NAME, PROJECT_CD,
CASE WHEN LCMC_DOC_NO IS NULL THEN MRODOC ELSE LCMC_DOC_NO END AS "DOCUMENT NUMBER"
FROM EQLIST_VIEW
WHERE PLAN_ID IN (736,1011)
AND LCMC_DOC_NO IN ('W56HZV0327W501','W52H090313X006','W52H090314X026',
'W52H090314X027','W52H090318X049','W52H090320X003','W56HZV0351M012',
'W56HZV0351M032','W56HZV0351M035','W919AD0334L091','W919AD0334L092',
'W919AD0352L025','W919AD0358L012','W919AD0358L017','W919AD0353L020',
'W56HZV0350M001')
ORDER BY NIIN, “DOCUMENT NUMBER

  问题是这样的,现在有超过4000个DOC_NO,我想要抽取这些数据放到C盘上的一个文本文件当中。我试了好几种方法,但是系统一直出现第五行错误提示:“Syntax error near 'C'”

  于是我重新写了一边查询:

Select PLAN_ID, EL_ID, NIIN, ITEM_NAME, PROJECT_CD,
CASE WHEN LCMC_DOC_NO IS NULL THEN MRODOC ELSE LCMC_DOC_NO END AS "DOCUMENT NUMBER"
FROM EQLIST_VIEW
WHERE PLAN_ID IN (736,1011)
AND LCMC_DOC_NO IN C:/Users/aj.moon/Desktop/TEMP/A5A_DOCNUM.TXT

  能否提供一些好的建议?

  答:你 并没有说你在使用哪一个版本的Oracle数据库,那么我就先假设为Oracle 9i。第一个问题是你不能直接使用文本文件,首先你要做的是让这些数据数据库内可用。你可以使用SQL*Loader来加载数据或者创建一个外部的表。 在这里我就简单介绍一下第二种方法。

  外部表可以允许Oracle查询存储在数据库之外的平面文件中的数据。SQL*Loader加载的 格式化存储数据你都可以访问。针对外部表,你无法使用INSERT/UPDATE/DELETE操作,但是你可以在查询中使用它们。一旦你创建了外部表, 你就可以在视图中使用它,并创建synonyms。通常情况下,使用外部表主要是为了进行ETL操作,它可以防止数据进入真实表。但是如果你打算频繁地查 询外部表,就需要考虑将数据加载到真实表当中,因为外部表无法进行索引,性能将会受到比较大的影响。


  首先,创建外部表定义,然后将它引用到文件当中。此时文件必须存放在Oracle可以访问的路径下,也就是说不能够放在本地磁盘,而是需要放在你的数据服务器路径下。然后创建一个DIRECTORY对象,指向文件路径:

CREATE OR REPLACE DIRECTORY ext_tab_dir AS 'C: emp';
然后,使用CREATE
TABLE..ORGANIZATION EXTERNAL语句创建外部表元数据
CREATE TABLE docnum_ext
(
doc_no
varchar2(30)
)
ORGANIZATION EXTERNAL
(
TYPE Oracle_LOADER
DEFAULT DIRECTORY ext_tab_dir
ACCESS PARAMETERS
(FIELDS TERMINATED
BY ',' )
LOCATION (
'A5A_DOCNUM.TXT')
)
;
 

  由于你没有提供文本文件的具体格式,所以我就假设是用逗号隔开的一系列值。如果你有不一样的格式,那么就需要在定义中更改ACCESS PARAMETERS,具体参考Oracle官方文档。

  创建好外部表之后,你可以用简单的查询进行测试:

SQL> SELECT *
2 FROM docnum_ext;
DOC_NO
----------------------------
  W56HZV0327W501
W52H090313X006
W52H090314X026
W52H090314X027
W52H090318X049
W52H090320X003
W56HZV0351M012
W56HZV0351M032
W56HZV0351M035
W919AD0334L091
W919AD0334L092
W919AD0352L025
W919AD0358L012
W919AD0358L017
W919AD0353L020
W56HZV0350M001
 

  当表的功能正常时,你可以反向查询:

Select PLAN_ID, EL_ID, NIIN, ITEM_NAME, PROJECT_CD,
CASE WHEN LCMC_DOC_NO IS NULL
THEN MRODOC
ELSE LCMC_DOC_NO
END AS "DOCUMENT NUMBER"
FROM EQLIST_VIEW
WHERE PLAN_ID IN (736,1011)
AND LCMC_DOC_NO IN (SELECT doc_no FROM docnum_ext)
ORDER BY NIIN, "DOCUMENT NUMBER"
;

  以上的例子可以为你提供一定的参考,你可以修改路径和外部表定义来满足你的实际情况。希望能够成为你的最终解决方案。


第三十八届CIO班招生
国际CIO认证培训
首席数据官(CDO)认证培训
责编:lyre

免责声明:本网站(http://www.ciotimes.com/)内容主要来自原创、合作媒体供稿和第三方投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。