5

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

4

3 回答 3

9

是的,有一个棘手的方法可以做到这一点。将一些东西放入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 调用

于 2015-05-22T08:10:14.183 回答
1

不会。Load只会将文件内容存储在 Sql*Plus 自己的 sql 缓冲区中。run然后,您可以editlist缓冲区。

替换变量不是加载文件的正确位置。variable为此使用 clob 类型的绑定,并使用utl_file. 但当然,在这种情况下,文件必须位于服务器上。

编辑:如果数据必须位于客户端上,您的选择是使用 pl/sql 块和对dbms_lob.writeappend的多次调用来加载 clob

您的文件必须看起来像这样(无法在 ATM 上测试它):

var l clob;

begin
  dbms_lob.createtemporary(l);
  dbms_lob.writeappend(l, 'abcdef...');
  dbms_lob.writeappend(l, 'ijkl...');
end;
/
于 2013-11-01T07:03:32.720 回答
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;
/
于 2019-10-25T11:24:37.557 回答