копирование хранимых процедур каждый в свой файл с помощью муравья - PullRequest
1 голос
/ 13 октября 2009

Я хочу иметь возможность иметь задачу ant, которая будет подключаться к удаленному экземпляру oracle и копировать хранимые процедуры каждая в свой собственный файл. Я знаю, что у меня может быть задание ant sql, которое выполнит

SELECT object_type, 
       object_name, 
       dbms_metadata.get_ddl(object_type, object_name) object_ddl 
FROM user_objects
WHERE OBJECT_TYPE in ('INDEX', 'TRIGGER', 'TABLE', 'VIEW', 'PACKAGE', 'FUNCTION', 'PROCEDURE', 'SYNONYM', 'TYPE')  
ORDER BY OBJECT_TYPE, OBJECT_NAME

, но это приведет к тому, что набор результатов будет все в одном файле, в то время как я хочу, чтобы файл для каждой процедуры (это потому, что я намереваюсь впоследствии отразить их в соответствии с тем, что в SVN).

Есть идеи?

Спасибо! Alex

Ответы [ 3 ]

1 голос
/ 13 октября 2009

Александр, большое спасибо за вашу помощь. Вот код, который я использовал, основываясь на вашем предложении. Единственный отказ от ответственности состоит в том, что, поскольку я должен был выполнить dbms_lob.substr для преобразования clob в varchar2, максимум, что я мог получить, - это 4000 символов из каждой процедуры ddl, а также он прервал форматирование во время этого преобразования и оказался в одной строке. Если у вас есть идеи, как решить эти две проблемы, дайте мне знать.

<target name="retrieve_procedures_names" depends="environment">

    <sql driver="${mp.db.driver.class}" url="${mp.db.connection.url}" userid="${mp.db.user.name}"
         password="${mp.db.password}" print="yes"
         output="${db.tmp.dir}/procedure_names.txt" onerror="stop" autocommit="true" encoding="UTF-8"
         showheaders="false" showtrailers="false">
        <classpath location="${db.driver.jar}"/>
        SELECT OBJECT_NAME FROM user_objects WHERE OBJECT_TYPE = 'PROCEDURE'
    </sql>

</target>
<target name="retrieve_procedures" depends="retrieve_procedures_names">
    <loadfile property="procnames" srcfile="${db.tmp.dir}/procedure_names.txt"/>
    <for list="${procnames}" delimiter="${line.separator}" param="sproc-name">
        <sequential>
            <sql driver="${mp.db.driver.class}" url="${mp.db.connection.url}" userid="${mp.db.user.name}"
                 password="${mp.db.password}" print="yes"
                 output="${db.tmp.dir}/@{sproc-name}.txt" onerror="stop" autocommit="true" encoding="UTF-8"
                 keepformat="true" showheaders="false" showtrailers="false">
                <classpath location="${db.driver.jar}"/>
                SELECT dbms_lob.substr(dbms_metadata.get_ddl(object_type, object_name), 4000, 1) FROM user_objects
                WHERE OBJECT_TYPE = 'PROCEDURE' and upper(object_name) = '@{sproc-name}'
            </sql>
        </sequential>
    </for>

</target>
1 голос
/ 13 октября 2009

Похоже, вы уже разобрались с самой сложной частью того, как построить оператор SQL и получить результаты с сервера базы данных на ваш компьютер.

Теперь сделайте это.

  1. Построение оператора SQL, чтобы получить все имена хранимых процедур.
  2. Выполнить <loadfile property="procnames" file="result-of-sql-run.txt"/>
  3. Используйте antcontrib для задачи , чтобы перебирать имена хранимых процедур

Вот как выполнить итерацию:

   <for list="${procnames}" delimeter="..." param="sproc-name">
      <sequential>
        <!-- Construct a new SQL statement to get specific
             stored procedure named @{sproc-name} -->
     </sequential>
   </for>

Мне было бы интересно узнать, как вы выполняете код SQL и подключаетесь к базе данных из ant, не могли бы вы опубликовать свое решение?

0 голосов
/ 13 октября 2009

Я сделал что-то подобное, и я бы посоветовал вам написать экстрактор / создатель файлов DDL на другом языке (я использовал Perl) и запустить его с задачей Ant exec - я знаю, что это что-то не одобряется, но переход на другой язык дает вам некоторые преимущества по сравнению с методом «SELECT DBMS_METADATA.GET_DDL ...»:

(Примечание: внешняя программа, которую вы будете писать, все еще является оболочкой для DBMS_METADATA.GET_DDL)

  • Вы можете программно установить DBMS_METADATA.SET_TRANSFORM_PARAM варианты, чтобы дать вам лучшее соответствие ваши стандарты контроля версий.

  • При необходимости вы можете удалить квалификаторы схемы.

  • Если ваши объекты изначально не были развернуты через Ant из системы контроля версий, вы можете уменьшить шум несоответствия, выполнив некоторые простые преобразования пробелов, которые могут вводить другие клиентские программы.

  • Вы можете лучше контролировать расширения файлов, которые вы производите, если у вас есть этот стандарт (например, ".trg" для триггеров).

...