0

私は理解できないという奇妙なエラーが発生しています....

スクリプトの実行時に ORA-03113 エラーが発生します。何が起こっているかの本質を示すダミースクリプトを作成しました。

declare
command_line varchar2(100);
v_stdout clob;
v_return number;
begin
    dbms_lob.createtemporary(v_stdout, true, DBMS_LOB.CALL);
command_line := './test.shl';
v_return := os_command.exec(p_command => command_line, p_stdout => v_stdout);
end;
/

test.shl:

echo 'Yay' > thisworked.log

これを実行すると、ログ ファイルが作成されず、次のようになります。

SQL> @morebroke
declare
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 77264
Session ID: 50 Serial number: 8551

どんな助けでも大歓迎です!

4

1 に答える 1

0

Ok。stdout は、リダイレクトしない限り、プロセスに接続された唯一の tty です。

sqlplus oracle 経由で接続すると、プロセスと通信する別のプロセスが作成されます。オラクルの個別のプロセスは、特別な tty について知ることができません。なんで?sqlplus を実行しているプロセスは、ネットワーク上のどこにでもある可能性があるためです。

これは、dbms_output がストアド プロシージャで何もしないのと同じ理由です。Solaris の /proc から:

lrwxrwxrwx   1 oracle   oinstall       0 Sep  3 07:38 0 -> /dev/null
lrwxrwxrwx   1 oracle   oinstall       0 Sep  3 07:38 1 -> /dev/null

これらは、Oracle サーバー上の sqlplus プロセスの stdin 0 と stdout 1 です。/dev/null (「ビットバケット」またはブラック ホール) を使用していることに注意してください。

したがって、そのリモート プロセス process に exec を要求しています。つまり、端末デバイスとして /dev/null を渡します。プロセスには、stdout tty に関する手がかりがありません。

utl_file代わりにパッケージを使用してください。または、Pro*C のようにコンパイル済みコードを記述し、直接 SQL を実行し、結果セットをローカル変数に返し、それをファイルに書き込みます。

于 2015-09-03T21:08:12.623 に答える