2016-05-16 220 views
0

.SQL腳本我有,例如這個表:基於.csv文件

table1.csv 
    Item;Location;Oftr;OftrPost;Replen 
    B01;BI1_p;40;01.05.2015;2 
    B02;BI1_p;40;01.05.20 

我想生成一個.SQL外部表腳本。這裏的樣本:

CREATE TABLE filename* 
(
row* type* 
row* type* 
row* type* 
) ORGANIZATION EXTERNAL (
TYPE ORACLE_LOADER 
DEFAULT DIRECTORY dir_name* 
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE 
SKIP 1 
FIELDS TERMINATED BY delimiter* 
MISSING FIELD VALUES ARE NULL 
) 
LOCATION(filename*) 
) 
reject limit unlimited; 

文件名,分隔符,DIR_NAME和行會不會是一個問題(很少checboxes,readline的,path.getiflename)。問題是類型*。 基本上我會在3/4變量之間移動 - float,number,varchar,(日期如果我能做到這一點) 問題是 - 如何識別哪一列有數字或浮點數或varchar? 我的第一個想法是REGEXP,但也許有人有更好的主意。

+0

這個請求步驟沒有太大的意義。如果其中一列的數據在所有行中都爲NULL,你會怎麼做? (意思是B01 ;; ... - 這意味着第一個值是B01,第二個是NULL,...)。此外,你可能有隻包含數字的字符串;例如,電話號碼應該作爲字符串(VARCHAR2)存儲,而不是數字。最後,如果你有像12-10-11這樣的日期,你將如何解釋?有六種不同的可能解釋,都是同樣合理的。也許如果你描述你試圖解決的更高層次的問題,我們可以考慮更好的方法。 – mathguy

回答

1

您可以爲int,float和date定義一些Regex,如果它們中沒有一個匹配,則它是一個varchar。或者你可以只使用int|double|DateTime.TryParse(),並且如果它們都不成功,則將其視爲varchar。

但請注意不僅要檢查數據的第一行,但其中的一些(如果可能,最好全部都是 - 稍後您必須解析它們)。另外請確保在檢查double之前檢查int,因爲double.TryParse()也會爲整數返回true。如果您使用正則表達式,請確保double的正則表達式也可以接受整數,因爲您可能在應該爲雙精度的列中有沒有小數位數的數字。

0

爲了防止您使用非代碼解決方案,我們的SQL Developer IDE將爲您解決這個問題。將其指向CSV,它將爲您生成外部表或SQL * Loader腳本。

To get started, right click on Tables node and say 'Import Data'

一步的指示here