我必须在每个文件行计数的文件夹中找到可用的文件名。然后,我将有两种列数据。
现在我必须将此记录插入到具有两列(col1,col2)的oracle表中。
我可以编写一个可以同时执行这两个操作的shell脚本。
我在这里发现了编写第一部分。 即
wc -l *| egrep -v " total$" | awk '{print $2 " " $1}' > output.txt
现在,如何将output.txt的数据插入到oracle表中。
答案 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的描述,首先阅读这个网页:
答案 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
希望这有帮助!