У меня есть небольшой сценарий 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