2011-09-13 3 views
1

단일 .SQL 파일에 테이블을 생성 * Plus를 만들거나 테이블에 대체 에뮬레이션 :는 BEGIN/END와 나는 오라클의 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 무시합니다. 또한, 전혀 도움 아무것도 인쇄하지 않습니다 - 단지 연결/분리 :

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 블록을 둘 수있는 가장 좋은 방법은 무엇입니까?

둘째, SQL * Plus에서 도움이되는 출력을 얻는 방법은 무엇입니까? 우리가 실행하는 각 .sql 파일에는 여러 CREATE 문 (테이블, 인덱스, 동의어 등)이있을 수 있습니다. 우리의 이상적인 출력은 무언가 같은 : 그런 일이 비록 SQL 또는 PL/SQL을 달성 할 경우

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

확실하지 - 너희들이 더 나은 생각하면,이 주위에 Bash는 나 파이썬 래퍼 스크립트를 작성하는 행복 해결책. 당신이 당신의 if 문에 넣어 깜빡

+0

당신은 실행 두/END를 시작하고 하나 개의 SQL 파일에 테이블을 생성하지만, 실제로 누락 된 조각 당신은 당신의 케이드 –

답변

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

헤야, 굉장해, 그것 =). 흠, 선언 한게 무슨 뜻이야? 나는이 스크립트에서 선언문을 사용하지 않고 있습니다.하지만 내가 그랬다면, 그들은 정상에있을 것입니다. 그것이 당신이 의미하는 것입니다. 맞습니까? 나는 여전히 사람들이 스크립트에서 각 SQL 문에 대한 성공/실패를 어떻게 처리하는지 궁금하지만, 아마도 별개의 질문입니다 ... – victorhooi

+0

@Codo 당신 말이 맞아요 .. victorhooi이 꼭대기에 선언을 넣는 데 꼭 필요한 것은 아닙니다. 이 코드의 ..하지만 anonymus 프로 시저 블록에 대한 필요성을 선언하는 이유는 내가 당신의 코드 가독성을 향상시킬 수 있다고 선언했기 때문입니다. –

-1

을 시작 declare를 사용하는 경우 더 나은 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; 
/