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、バッファeditを使用できます。list

置換変数は、ファイルをロードする適切な場所ではありません。variableそのためにタイプ clobのバインドを使用し、 を使用してファイルの内容をロードしますutl_file。ただし、もちろん、この場合、ファイルはサーバー上に配置する必要があります。

edit : データをクライアントに配置する必要がある場合、オプションは、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 に答える