2016-05-16 70 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