BEGIN / END и CREATE Table в одном файле .sql - PullRequest
1 голос
/ 13 сентября 2011

У меня есть небольшой сценарий SQL, который я выполняю вместе с Oracle SQL * Plus для эмуляции создания или замены в таблицах:

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, если вы думаете, что это лучшее решение.

Ура, Victor

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Вы забыли вставить свое заявление 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 также в первой строке, перед началом запуска

0 голосов
/ 13 сентября 2011

Для вывода в 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;
/
...