2016-09-26 7 views
0

У меня есть файл SQL, который имеет следующее statments:Ошибка сценария в Oracle SQL

BEGIN 
if (&&masterKey = 1) then 
shutdown immediate; 
startup restrict; 
end if; 
END; 
/

В другом файле SQL (defineVariables.sql) Я объявленный переменная MasterKey.

DEFINE masterKey = 0; 

и импортирован, что SQL здесь, используя

@defineVariables.sql 

В то время как я выполнить сценарий, я получаю следующее сообщение об ошибке. Я не уверен, что это потому, что я использую инструкцию shutdown? Может кто-нибудь, пожалуйста, помогите мне с этим вопросом?

Сообщение об ошибке:

SQL> BEGIN 
    2 if (&&masterKey = 1) then 
    3 shutdown immediate; 
    4 startup restrict; 
    5 end if; 
    6 END; 
    7/
old 2: if (&&masterKey = 1) then 
new 2: if (0 = 1) then 
shutdown immediate; 
     * 
ERROR at line 3: 
ORA-06550: line 3, column 10: 
PLS-00103: Encountered the symbol "IMMEDIATE" when expecting one of the 
following: 
:= . (@ % ; 
ORA-06550: line 5, column 1: 
PLS-00103: Encountered the symbol "END" when expecting one of the following: 
begin function pragma procedure subtype type <an identifier> 
<a double-quoted delimited-identifier> current cursor delete 
exists prior 
+5

выключение немедленным не является командой PLSQL. Это команда sqlplus. – Rene

+1

Я не думаю, что вы можете использовать как shutdown, так и startup в одном блоке plsql. Из вашего кода, как только выполнение будет немедленно завершено, вся БД будет закрыта. Заявления после этого не выполняются вообще. – XING

+0

@XING У меня не было проблем с запуском скрипта без блока BEGIN и END и без условия if. Поэтому, возможно, проблема заключается в том, что Рене указал неверный синтаксис. Но есть ли способ выбрать эти статусы на основе флага? – pna

ответ

2

Вы не можете сделать это в PLSQL, поскольку «выключение немедленного» не PLSQL или SQL команды, но команда SQLplus. Одним из способов достижения условного выполнения скриптов описаны в ответе на этот вопрос: SQLplus decode to execute scripts

В основном, в зависимости от стоимости вашего Masterkey выбрать один из двух имен сценариев, а затем выполнить скрипт с этим именем.

На основании кода предыдущего примера.

sql> variable flag varchar2(7); 
    sql> exec :flag := '&&masterKey'; 
    sql> column our_script new_value script noprint; 
    sql> select decode(:flag, '1', 
        'c:\sqlplus\shutdown_script.sql', 
        'c:\sqlplus\do_not_shutdown.sql' 
        ) our_script 
    from dual; 

Execution

sql> @&script; 

shutdown_script будет

prompt shutting down 
shutdown immediate; 

do_not_shutdown скрипт будет

prompt Not shutting down 
+0

Благодарим вас за ответ, однако это не ясно для меня. Как выбрать имя сценария? Я также не понимаю пример декодирования. – pna

+0

Лично у меня никогда не было сценариев закрытия базы данных. Поэтому я не уверен, что вы решаете правильную проблему. – Rene

+0

Это для сценария отката в процессе архивирования, где мы пытаемся отбросить некоторых пользователей, которые мы создали для процесса. В большинстве сценариев мы не ожидаем, что любой пользователь будет активным, поэтому masterKey будет равен нулю, и нам не нужно останавливать и перезапускать в ограниченном режиме. Однако, если оператор хочет обеспечить это, мы разрешаем ему установить флаг masterkey в 1, чтобы db был выключен, и все пользователи были удалены без каких-либо проблем. – pna