设为首页 收藏本站
查看: 848|回复: 0

[经验分享] Oracle数据提到文本文档进行查询的方法

[复制链接]

尚未签到

发表于 2016-8-6 16:02:41 | 显示全部楼层 |阅读模式
在数据库中我运行了以下的查询语句:
    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:\temp\';
    然后,使用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"
    ;
    以上的例子可以为你提供一定的参考,你可以修改路径和外部表定义来满足你的实际情况。希望能够成为你的最终解决方案。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-253794-1-1.html 上篇帖子: 周末Oracle技术沙龙、盖国强、我的同事们 下篇帖子: 谈谈Oracle 10g备库闪回空间设置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表