Sqlplus可以将文件内容读入变量吗?
Posted
技术标签:
【中文标题】Sqlplus可以将文件内容读入变量吗?【英文标题】:Can Sqlplus read the contents of a file into a variable? 【发布时间】:2013-11-01 05:23:22 【问题描述】:我一直在修改 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] 表示您要加载的文件(通常是脚本)。
【问题讨论】:
【参考方案1】:是的,有一个棘手的方法可以做到这一点。 将一些东西放入 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 调用
【讨论】:
两年过去了,我想我还有一些用处。给我几个小时来测试一下,如果它通过了,我会接受它。非常感谢。 它不适用于 DTD 文本文件:它是一个没有“@”字符的简单文件,我尝试使用 dbms_xdb.createresource('/public/mydtds/my.dtd' , dtd);其中 dtd 是如上所述的加载文件。我会从 dbms_xdb.getContentVarchar2('/public/mydtds/my.dtd') 得到一行 open=F, temp=T, length=21, chunksize=8132, data= @@my.dtd【参考方案2】:没有。 Load
只会将文件内容存储在 Sql*Plus 自己的 sql 缓冲区中。然后您可以run
、edit
和list
缓冲区。
替换变量不是加载文件的正确位置。为此使用 clob 类型的绑定 variable
,并使用 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;
/
【讨论】:
考虑过 utl_file,但后来我必须将它放到 db 服务器自己的文件系统中。我不知道我能不能真正接触到它,这是办公室政治的事情。但是运行 sqlplus 的机器,该文件已经可以使用了。我只需要将它放入一个 clob 中,以便我可以在 plsql 中对其进行操作。 感谢编辑,但恐怕我不明白。声明一个 clob 没什么特别的,但 writeappend 似乎无法从 SQLPlus 缓冲区中读取,这是我知道的将文件内容放入 SQLPlus 客户端的唯一其他方法。我很密集吗?【参考方案3】:请考虑使用文字引号字符串 - 这允许您在链接文件中使用引号:
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;
/
【讨论】:
以上是关于Sqlplus可以将文件内容读入变量吗?的主要内容,如果未能解决你的问题,请参考以下文章