我一直在修补sqlplus一段时间了,我已经设法让sqlplus将文件内容读入替换变量中:
exit | sqlplus -s login/pass@db @script.sql "`cat file.txt`"
这主要用于我的脚本需要...甚至保留文件中的换行符。但是,我只使用了50或60字节大小的示例文件。我最终使用的实际文件将至少为几千字节。所以就在这时我决定检查替换变量的最大大小:240个字符。
我的sqlplus脚本中有没有办法将文件的内容读入绑定变量? Oracle文档似乎用GET命令暗示这一点,说通常你只是用来加载sql / sqlplus脚本。
http://docs.oracle.com/cd/B10501_01/server.920/a90842/ch13.htm#1009882
file_name [.ext]表示要加载的文件(通常是脚本)。
答案 0 :(得分:5)
是的,这是一个棘手的方法。 将一些东西放入 props.txt 并运行脚本:
DECLARE
-- the @@ expression must be in separate line as follows
file_contents VARCHAR2(32767) := '
@@props.txt
';
BEGIN
dbms_output.put_line('===');
dbms_output.put_line(file_contents);
dbms_output.put_line('===');
END;
/
请注意,文件props.txt
不能包含" @"或者你会嵌套
SQL * PLUS调用
答案 1 :(得分:1)
没有。 Load
只会将文件内容存储在Sql * Plus自己的sql缓冲区中。然后,您可以run
,edit
和list
缓冲区。
替换变量不是加载文件的正确位置。使用类型为clob的绑定variable
并使用utl_file
加载文件内容。但当然,在这种情况下,文件必须位于服务器上。
编辑:如果数据必须位于客户端,您的选择是使用pl / sql块加载clob并多次调用dbms_lob.writeappend
您的文件必须如下所示(无法测试ATM):
var l clob;
begin
dbms_lob.createtemporary(l);
dbms_lob.writeappend(l, 'abcdef...');
dbms_lob.writeappend(l, 'ijkl...');
end;
/
答案 2 :(得分:0)
请考虑使用带引号的字符串-允许您在链接文件中使用引号:
DECLARE
-- the @@ expression must be in separate line as follows
file_contents VARCHAR2(32767) := q'[
@@props.txt
]';
BEGIN
dbms_output.put_line('===');
dbms_output.put_line(file_contents);
dbms_output.put_line('===');
END;
/