您好我经常需要在表格中插入大量数据。例如,我将以
的形式从excel或文本文件中获取数据1,a
3,bsdf
4,sdkfj
5,something
129,else
然后我经常在这个例子中构造6个insert语句并运行SQL脚本。我发现当我必须向服务器发送数千个小包时,这很慢,这也会给网络带来额外的开销。
你最好的方法是什么?
更新:我正在使用ORACLE 10g。
答案 0 :(得分:9)
参见例如
一个可以帮助您入门的简单示例
您需要一个位于服务器目录中的文件(熟悉directory objects):
SQL> select directory_path from all_directories where directory_name = 'JTEST';
DIRECTORY_PATH
--------------------------------------------------------------------------------
c:\data\jtest
SQL> !cat ~/.gvfs/jtest\ on\ 192.168.xxx.xxx/exttable-1.csv
1,a
3,bsdf
4,sdkfj
5,something
129,else
创建外部表:
create table so13t (
id number(4),
data varchar2(20)
)
organization external (
type oracle_loader
default directory jtest /* jtest is an existing directory object */
access parameters (
records delimited by newline
fields terminated by ','
missing field values are null
)
location ('exttable-1.csv') /* the file located in jtest directory */
)
reject limit unlimited;
现在,您可以使用 SQL 的所有功能来访问数据:
SQL> select * from so13t order by data;
ID DATA
---------- ------------------------------------------------------------
1 a
3 bsdf
129 else
4 sdkfj
5 something
答案 1 :(得分:1)
我不确定这是否适用于Oracle,但在SQL Server中,您可以使用BULK INSERT sql语句从txt或csv文件上传数据。
BULK
INSERT [TableName]
FROM 'c:\FileName.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
GO
只需确保表列与txt文件中的whats正确匹配即可。使用更复杂的解决方案,您可能需要使用格式文件,请参阅以下内容: http://msdn.microsoft.com/en-us/library/ms178129.aspx
答案 2 :(得分:0)
有很多方法可以加快速度。
1)在一次交易中完成。这将通过避免连接打开/关闭来加快速度。
2)直接加载为CSV文件。如果将数据作为CSV文件加载,则根本不需要“SQL”语句。在MySQL中,“LOAD DATA INFILE”操作非常直观和简单地完成了这一操作。
3)您也可以将整个文件作为文本转储到名为“raw”的表中。然后让数据库使用触发器自行解析数据。这是一个黑客攻击,但它将简化您的应用程序代码并减少网络使用。