Oracle數據提到文本文檔進行查詢的方法

來源: IT人家  發布時間: 2011-03-23 10:43  閱讀: 1598 次  推薦: 1   原文鏈接   [收藏]  
摘要:該文章將向您講述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:\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
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()