SQL* Plus - Спул в несколько файлов - PullRequest
1 голос
/ 20 марта 2020

У меня есть следующая катушка, которая сохраняет DDL user_tables в файл:

set pagesize 0
set long 90000
spool C:\Users\personal\Desktop\MAIN_USR\test.txt
select DBMS_METADATA.GET_DDL('TABLE',table_name,'MAIN_USR')
FROM user_tables ut;
spool off
exit

Возвращает DDL всех user_tables в один файл, но мне это нужно быть немного более динамичными c и возвращать их в отдельных файлах с именем файла соответствующей таблицы. Примерно так:

set pagesize 0
set long 90000
FOR tab_nam IN (SELECT table_name FROM user_tables) LOOP
   spool C:\Users\personal\Desktop\MAIN_USR\test.txt
      select DBMS_METADATA.GET_DDL('TABLE',table_name,'MAIN_USR')
      FROM user_tables ut;
   spool off
END LOOP;
exit

Я знаю, что вышеприведенное не сработает, но это своего рода представление о том, что я хочу сделать.

Я ценю любую помощь

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Использование python cx_Oracle модуля, который обеспечивает доступ к Oracle База данных может быть элегантным способом для вашего случая:

import cx_Oracle
con = cx_Oracle.connect('uname/pwd@host:port/service_name')
cur = con.cursor()

def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
    if defaultType == cx_Oracle.CLOB:
        return cursor.var(cx_Oracle.LONG_STRING, arraysize = cursor.arraysize)

cur.outputtypehandler = OutputTypeHandler

cur.execute("select table_name from user_tables order by 1")
rec = cur.fetchall()

for r in rec:
    cur.execute("select dbms_metadata.get_ddl('TABLE',:tableName) from dual",tableName=r[0])
    ddl, = cur.fetchone()

    file = r'C:\\Users\\personal\\Desktop\\MAIN_USR\\'+r[0]+'.txt' 

    with open(file,"w") as f:
            f.write(ddl)
    f.close()

, где имена таблиц всей схемы определяются через первый cur.execute, и их создание DDL выполняется во втором, а файлы создаются с соответствующими именами таблиц на последнем шаге. Важно учитывать, что использование OutputTypeHandler связано с избавлением от обработки результата CLOB, вытекающего из функции Dbms_Metadata.Get_Ddl. Компилятор не захочет получать значение CLOB во время создания файлов, или DDL будет настолько длинным, что будет превышать длину 4000 символов, что предотвратит преобразование to_char с ошибкой повышения без использования OutputTypeHandler.

0 голосов
/ 20 марта 2020

Вам нужно прочитать USER_TABLES для создания N вызовов DBMS_METADATA.GET_DDL, каждый из которых имеет свой буферный файл. Спул все в файл с именем. sql и запустить его после спулинга

set pagesize 0
set long 90000

SET TERMOUT OFF
spool out.sql

select 'spool C:\Users\personal\Desktop\MAIN_USR\'||REPLACE(table_name, '$', '_')||'.txt'||chr(13)||chr(10)||
'SELECT DBMS_METADATA.GET_DDL(''TABLE'','''||table_name||''',''MAIN_USR'') FROM DUAL;'||chr(13)||chr(10)||
'spool off' as cmd
FROM user_tables ut;

spool off

@OUT.SQL

exit
...