shell脚本找到文件名&每个文件的行数,现在将此记录插入Oracle表

时间:2010-09-07 18:49:52

标签: oracle bash

我必须在每个文件行计数的文件夹中找到可用的文件名。然后,我将有两种列数据。

现在我必须将此记录插入到具有两列(col1,col2)的oracle表中。

我可以编写一个可以同时执行这两个操作的shell脚本。

我在这里发现了编写第一部分。 即

wc -l *| egrep -v " total$" | awk '{print $2 " " $1}' > output.txt

现在,如何将output.txt的数据插入到oracle表中。

4 个答案:

答案 0 :(得分:3)

在版本9i中,Oracle给了我们external tables。这些对象允许我们通过SELECT语句查询OS文件中的数据。这很酷。更酷的是,在11.0.1.7中,我们可以将shell脚本与外部表关联起来以生成其OS文件。查看Adrian Billington关于listing files with the external table preprocessor in 11g的文章。 shell脚本是预处理器功能的理想选择。

如果您现在需要知道目录的内容用于任何目的,您只需从外部表中选择。如果要保留文件名的永久记录,可以发出INSERT INTO ... SELECT * FROM external_table;。该语句可以使用数据库作业自动运行。

答案 1 :(得分:2)

你有两个选择。 我用这个表结构测试了两个:

SQL> create table tbl_files(fileName varchar(20), lineCount number);

首选是生成带有插入SQL命令的sql脚本,并运行sqlplus命令行实用程序。我稍微修改了你的shell脚本:

wc -l *| egrep -v " total$" | awk '{q=sprintf("%c", 39); print "INSERT INTO TBL_FILES(fileName, lineCount) VALUES (" q$2q ", " $1 ");";}' > sqlplusfile.sql

运行此脚本文件后,“sqlplusfile.sql”包含以下内容:

INSERT INTO TBL_FILES(fileName, lineCount) VALUES ('File1.txt', 10);
INSERT INTO TBL_FILES(fileName, lineCount) VALUES ('File2.txt', 20);
INSERT INTO TBL_FILES(fileName, lineCount) VALUES ('File3.txt', 30); 

现在您可以在parametr:

中直接使用此文件运行sqlplus命令
sqlplus username/password@oracle_database @sqlplusfile.sql

运行此脚本后,表格如下所示:

SQL> select * from tbl_files;

FILENAME              LINECOUNT
-------------------- ----------
File1.txt                    10
File2.txt                    20
File3.txt                    30

注意:在文件末尾“sqlplusfile.sql”必须出现“commit;”否则,你不会在表格中看到数据。

第二选择是使用sqlldr命令行工具(此工具是Oracle Client安装的一部分)

再次,稍微修改了你的脚本:

wc -l *| egrep -v " total$" | awk '{print "\""$2"\"" "," $1}' > data.txt

文件“data.txt”的内容如下所示:

"File1.txt",10
"File2.txt",20
"File3.txt",30

在同一目录中,我使用以下内容创建了文件“settings.ctl”:

LOAD DATA
INFILE data.txt
INSERT
INTO TABLE TBL_FILES
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
(fileName, lineCount)

现在您可以运行此命令,将数据加载到数据库中:

sqlldr userid=user/passwd@oracle_database control=settings.ctl

sqlldr实用程序是更好的选择,但在某些Oracle客户端安装中不存在。

答案 2 :(得分:0)

您可以使用命令行工具SQL Loader将文本数据加载到Oracle中。这里有很多关于如何使用SQL Loader的描述,首先阅读这个网页:

http://www.orafaq.com/wiki/SQL*Loader_FAQ

答案 3 :(得分:0)

我不了解Oracle,但似乎SQL语法与MySQL非常相似。

从本质上讲,你可以通过一次微小的改变来做你在这里所做的事。

wc -l *| egrep -v " total$" | awk '{print $2 "|" $1}' > output.txt

您可以编写一个名为thesql.sql的SQL脚本,如下所示:

LOAD DATA
INFILE output.txt
INTO TABLE yourtable
FIELDS TERMINATED BY '|'
(col1, col2)

然后,在你的脚本中(这是我朦胧的地方),有这样的一行:

sqlplus <user>/<pw>@<db> @thesql.sql

我从几个不同来源找到了一些帮助 - herehere

希望这有帮助!