テーブルの作成または置換をエミュレートするために、Oracle の SQL*Plus で実行している小さな SQL スクリプトがあります。
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE symbols';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
END IF;
END;
/
CREATE TABLE symbols (
blah blah,
blah blah,
);
EXIT;
SQL*Plus コマンドラインは次のとおりです。
sqlplus aegsys15_owner/pass#234@MARVINUAT03 @createSymbolsTable.sql << EOF
> EOF
END の後のスラッシュ (/) を省略すると、最初の BEGIN/END ブロックのみを処理するように見え、その下の CREATE TABLE セクションを無視します。また、ヘルプはまったく出力されません-接続/切断するだけです:
SQL*Plus: Release 11.2.0.1.0 Production on Tue Sep 13 15:49:34 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
78 Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ただし、スラッシュがあると、エラーが発生します。
END IF;
*
ERROR at line 6:
ORA-06550: line 6, column 5:
PLS-00103: Encountered the symbol "END" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
CREATE TABLE symbols (
*
ERROR at line 1:
ORA-00955: name is already used by an existing object
まず、先頭に BEGIN/END 例外ブロックと CREATE TABLE ブロックの両方を同じ .sql ファイルに配置する最良の方法は何ですか?
次に、SQL*Plus から有用な出力を取得する方法は何ですか? 実行する各 .sql ファイルには、複数の CREATE ステートメント (テーブル、インデックス、シノニムなど) が含まれる場合があります。理想的な出力は次のようになります。
TABLE foo: Pass
SYNONYM bar: Fail
INDEX foo_1: Pass
ただし、そのようなことが SQL または PL/SQL で達成できるかどうかはわかりません。これがより良い解決策だと思われる場合は、Bash または Python ラッパー スクリプトを作成して喜んでください。
乾杯、ビクター