我的目标是将外部表日志文件加载到oracle数据库的CLOB列中。我一直遇到你可以立即插入的最大大小的问题,但我能够插入整个文件,如果我to_clob日志文件的每一行,连接然后插入它们(据我知道这似乎是最快最简单的方法吗?):
insert into clob_insert_test values (to_clob('hfsdjhfjsdhfjksd')||chr(10)||to_clob('jhfklsdjfklsdjklfjdsjlk'));
我的问题是: 我正在将文件读入shell变量,如下所示,我需要做的是将 to_clob(')预先挂起到变量的每一行的开头,然后追加')| | chr(10)|| 并从变量中删除最后的 || chr(10)|| 以完成。然后我可以在clob列的SQL插入语句中使用该变量。有没有一种方法可以直接在变量上执行此操作,而不是在读取之前修改日志文件?
log_content=$(<"$log_file")
编辑:
抱歉,我不认为我很清楚。给定示例日志文件,我期望以下变量内容。
输入文件:
LOG file opened at 05/05/15 15:12:24
Field Definitions for table ext_loading
Record format DELIMITED BY NEWLINE
可变内容:
to_clob('LOG file opened at 05/05/15 15:12:24')||char(10)||to_clob('Field Definitions for table ext_loading')||char(10)||to_clob('Record format DELIMITED BY NEWLINE')
答案 0 :(得分:2)
我假设您有一个类似的文件:
this is me||chr(10)||adfasdf
asdas||chr(10)||asdfasdfasdas
你希望它变得像:
to_clob('this is meadfasdf')||chr(10)||
to_clob('asdasasdfasdfasdas')||chr(10)||
如果是这样,您可以像这样使用sed
:
sed -e "s/||chr(10)||//" -e "s/^/to_clob('/" -e "s/$/')||chr(10)||/" file
那是:
||chr(10)||
一次。to_clob('
添加到每行的开头。')||chr(10)||
添加到每行的末尾。并将其存储在变量中:
log_content=$(sed -e "s/||chr(10)||//" -e "s/^/to_clob('/" -e "s/$/')||chr(10)||/" "$log_file")
要匹配真正所需的内容,您也可以这样做:
line=$(sed -e "/./s/^/to_clob('/" -e "/./s/$/')||chr(10)||/" "$log_file")
然后输出是:
$ echo $line # note, without quotes to have all of it together!
to_clob('LOG file opened at 05/05/15 15:12:24')||chr(10)|| to_clob('Field Definitions for table ext_loading')||chr(10)|| to_clob('Record format DELIMITED BY NEWLINE')||chr(10)||
并删除最后一个||chr(10)||
:
$ echo $line | sed 's/||chr(10)||$//'
to_clob('LOG file opened at 05/05/15 15:12:24')||chr(10)|| to_clob('Field Definitions for table ext_loading')||chr(10)|| to_clob('Record format DELIMITED BY NEWLINE')