2016-11-16 4 views
0

У меня есть сценарий Ant для выполнения процедур SQL и PL/SQL.Ошибка выполнения исполняемого файла Ant exec для выполнения процедуры PL/SQL

<exec executable="sqlplus" failonerror="true" >   
    <arg value="${user}/${password}@${DB}" /> 
    <arg value="@${scriptFilename}" /> 
</exec> 

Приведенный выше код выполняет сценарии SQL и пакеты, но не процедуры, как:

BEGIN 
    -- drop functions 
    FOR R IN (
     SELECT owner, object_name 
     FROM all_objects 
     WHERE owner='FCPOTP' 
     AND OBJECT_TYPE IN ('FUNCTION')) 
    LOOP 
     EXECUTE IMMEDIATE 'drop function '||R.owner||'.'||R.object_name; 
    END LOOP; 
    -- drop procedure 
    FOR R IN (
     SELECT owner, object_name 
     FROM all_objects 
     WHERE owner='FCPOTP' 
     AND OBJECT_TYPE IN ('PROCEDURE')) 
    LOOP 
     EXECUTE IMMEDIATE 'drop procedure '||R.owner||'.'||R.object_name; 
    END LOOP;  
END; 

Как я могу использовать те же самые exec sqlplus исполняемые файлы для выполнения все?

+0

Как это провал "- какие ошибки вы получаете? Это действительно часть процедуры или анонимный блок; и что происходит, если вы запускаете, чем вручную через SQL \ * Plus? –

+0

@AlexPoole - я не получил никаких ошибок. Но блок не выполняется. Он просто говорит [exec] Подключен к: [exec] Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production [exec] С опцией Разметка [exec] [exec] 36 Отключен от Oracle Database 11g Enterprise Издание 11.2.0.4.0 - 64bit Production [exec] С опцией Разметка [echo] ===== End ===== [echo] – useranon

+0

Было бы лучше показать этот вывод в вопросе так он может быть отформатирован правильно. Но я понимаю суть этого. –

ответ

2

У вас нет ошибки и с вывода в комментарии, что вы не видите исполняемый блок. Это потому, что это не так. From the documentation:

SQL * Plus хранит подпрограммы, которые вы вводите в SQL-буфере. Выполните текущую подпрограмму с помощью команды RUN или slash (/). Точка с запятой (;) рассматривается как часть подпрограммы PL/SQL и не будет выполнять команду.

В настоящий момент ваш анонимный блок (подпрограмма) вводится в «SQL-буфер», но никогда не выполняется.

Вам просто нужно добавить / в файл сценария, после анонимного блока:

... 
    LOOP 
     EXECUTE IMMEDIATE 'drop procedure '||R.owner||'.'||R.object_name; 
    END LOOP;  
END; 
/
+0

После добавления/процедура выполнена успешно. Спасибо. – useranon

Смежные вопросы