将所有CSV列批量加载到Oracle表中

时间:2014-11-12 19:11:45

标签: sql oracle oracle11g

我正在尝试将CS​​V中的所有列加载到Oracle表中。两者之间的列匹配。我试图使查询动态,所以我会用它将数据从任何CSV加载到任何匹配的表,因此,我想避免命名列名称(jobCounter列应该用通配符替换(如果有'任何)。我不确定这是否正确。

LOAD DATA
INFILE 'C:\Users\Theuser\Documents\20121017.csv'
APPEND
INTO TABLE SRT_FACTOR_20121017
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
   jobCounter //* I want to replace this with an asterisk to include all the columns
)

目前,我在使用Oracle SQL Developer时遇到以下错误:

Error at Command Line : 217 Column : 5
Error report -
SQL Error: ORA-00928: missing SELECT keyword
00928. 00000 -  "missing SELECT keyword"
*Cause:    
*Action:

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

事实是你不能通过SQL * Loader将任何列加载到匹配的表中。字段定义必须是准确的。

答案 1 :(得分:0)

您正在尝试在SQL Developer中运行sqlldr脚本。 SQL Developer大部分只理解SQL和PL / SQL。

所以你已经使用SQL Developer为你生成了这个脚本 - 你几乎就在那里。

现在只需从doc / NIX cmd / shell提示符运行该脚本...假设您安装了包含sqlldr程序的Oracle客户端。

需要更多帮助?我谈论这个过程here

答案 2 :(得分:0)

您提供的文件是sqlldr使用的控制文件。它基本上告诉sqlldr什么数据以及在哪个表(和相应的列)中存储所述数据。

如果要在.NET项目中包含负载,则必须运行外部命令,该命令使用某些参数调用sqlldr。

示例:

public static void loadDataFromFile(string dbUser, string dbHost, string dbPass, string ctrlFile, string loaderLog, string loaderBad)
{
    Process prcLoader = new Process();
    prcLoader.StartInfo.FileName = "sqlldr";
    prcLoader.StartInfo.Arguments = dbUser + "@" + dbHost + "/" + dbPass + " control=" + ctrlFile + " log=" + loaderLog + " bad=" + loaderBad + " errors=9999";
    prcLoader.Start();
    prcLoader.WaitForExit();
}

我建议您加密数据库连接数据,如dbUser,dbPass等,并在调用上述方法时对其进行解密。实现此目的的一种方法是将加密数据存储在项目设置中并从那里读取。

下面的字符串是文件的路径,其中ctrlFile =控制文件(您发布的文件),loaderLog = sqlldr的输出(包含成功加载的行),loaderBad = sqlldr的输出(包含不成功的行,可能没有加载。)

string ctrlFile, string loaderLog, string loaderBad