Использование 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
.