Sqlplus可以将文件内容读入变量吗?

时间:2013-11-01 05:23:22

标签: oracle sqlplus

我一直在修补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]表示要加载的文件(通常是脚本)。

3 个答案:

答案 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缓冲区中。然后,您可以runeditlist缓冲区。

替换变量不是加载文件的正确位置。使用类型为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;
/