这是我使用的oracle命令:-
query = '''SELECT DBMS_METADATA.GET_DDL('TABLE', 'MY_TABLE', 'MY_SCHEMA') FROM DUAL;'''
cur.execute(query)
现在,如何使用cx_Oracle
和python3
获取表的ddl。
请帮帮忙。我无法提取ddl。
发布于 2019-11-24 06:50:52
以下代码可用于从dbms_metadata获取DDL的内容:
import cx_Oracle
conn = cx_Oracle.connect("username/password@hostname/myservice")
cursor = conn.cursor()
def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.CLOB:
return cursor.var(cx_Oracle.LONG_STRING, arraysize = cursor.arraysize)
cursor.outputtypehandler = OutputTypeHandler
cursor.execute("select dbms_metadata.get_ddl('TABLE', :tableName) from dual",
tableName="THE_TABLE_NAME")
text, = cursor.fetchone()
print("DDL fetched of length:", len(text))
print(text)
使用输出类型处理程序是为了消除处理CLOB的需要。如果没有它,您将需要执行str(lob)
或lob.read()
才能获取其内容。但是,无论哪种方式,您都不会被限制在4000个字符以内。
发布于 2019-11-25 09:18:46
cx_Oracle具有对调用PL/SQL的本机支持。
假设您有connection和cursor对象,代码片段将如下所示:
binds = dict(object_type='TABLE', name='DUAL', schema='SYS')
ddl = cursor.callfunc('DBMS_METADATA.GET_DDL', keywordParameters=binds, returnType=cx_Oracle.CLOB)
print(ddl)
您不需要将DDL拆分成4k/32k块,因为Python的str
没有这个限制。为了获得一个块中的DDL,只需将returnType
设置为cx_Oracle.CLOB
即可。您可以稍后通过执行str(ddl)
将其转换为str
。
https://stackoverflow.com/questions/58989485
复制相似问题