2011-09-13 10 views
1

単一.sqlファイルにテーブルを作成* Plusを作成したり、テーブルの上に置き換えるエミュレートする:はBEGIN/ENDと私はOracleのSQLを実行しています小さな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のコマンドラインがあります:私はEND後にスラッシュ(/)を省略した場合

sqlplus aegsys15_owner/pass#[email protected] @createSymbolsTable.sql << EOF 
> EOF 

、最初の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例外ブロックと同じ.sqlファイルのCREATE TABLEブロックの両方を持つ最良の方法は?

第2に、SQL * Plusから役立つ出力を得るための方法は何ですか?実行する各.sqlファイルには、複数のCREATE文(表、索引、同義語など)があります。私たちの理想的な出力は次のようになり、何かのように:そのようなことはしかし、SQLやPL/SQLで達成可能である場合

TABLE foo: Pass 
SYNONYM bar: Fail 
INDEX foo_1: Pass 

わからない - あなたたちはそれが良いことだと思うならば、この問題を回避バッシュやPythonラッパースクリプトを書くことが幸せ溶液。あなたのif文に入れるのを忘れ

+0

あなたは/ ENDを開始し、1つのSQLファイルにテーブルを作成しますが、あなたのCADEに –

答えて

2

乾杯、 ビクター...

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; 
/

、あなたはまた、最初の行で、前に開始出力の場合

+0

NULLをマイナー版をしなければならないことは確かに欠けているの両方を実行することができます。しかし、DECLAREを最初の行に置く理由はありません。これは、変数やローカルプロシージャを宣言する場合にのみ必要です。 – Codo

+0

heya、Awesome、それは=それを固定しました)。うーん、あなたは宣言で何を意味しましたか?私はこのスクリプトで宣言を使用していません - しかし、私がした場合、彼らは一番上になるでしょう - それはあなたが意味するものです、そうですか?私はまだ自分のスクリプト内の各SQLステートメントの成功/失敗を報告する方法を人々がどのように扱っているのかは分かりませんが、おそらく別の質問です... – victorhooi

+0

@Codoあなたは正しいです.. これは頂上に宣言する必要はありませんしかし、匿名のプロシージャブロックでは、宣言キーワードが必要です。その理由は、コードの可読性を向上させるために "宣言"を追加できるということだけです... –

-1

を開始declareを使用する場合は、より良いですslqplusでは、promptコマンドを使用します。 pl/sql(つまり開始/終了ブロック内)からの出力の場合は、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; 
/
関連する問題