1

テーブルの作成または置換をエミュレートするために、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 ラッパー スクリプトを作成して喜んでください。

乾杯、ビクター

4

2 に答える 2

2

if文を入れるのを忘れていました..

BEGIN     
     EXECUTE IMMEDIATE 'DROP TABLE symbols'; 
EXCEPTION     
  WHEN OTHERS THEN         
   IF SQLCODE != -942 THEN     
 --here you have to write something for this exception
 -- if you don't have any activity to do then you can use NULL (atleast)
 -- you can't put this if statement body empty in oracle
 NULL;
END IF; 
END; 
/ 

declareまた、begin が始まる前の最初の行でも使用するとより効果的です

于 2011-09-13T06:10:05.763 に答える
-1

slqplus で出力するには、prompt コマンドを使用します。pl/sql からの出力 (つまり、begin/end ブロック内) には、dbms_output.put_line() 関数を使用します。

prompt Creating foo table
begin
  create table foo...;
  dbms_output.put_line('success');
exception
  when others then
    dbms_output.put_line('fail');
end;
/
于 2011-09-13T07:44:01.080 に答える