使用cx_Oracle 5.1.2,python 2.7和Oracle 11g,我的情况如下:
我有一个cx_oracle游标连接到DB_one我会调用cur_input而另一个游标连接到DB_two我将调用cur_output。
在cur_input上执行选择后,我希望能够生成它的DDL以在cur_output上创建拟合表,然后将数据插入来自cur_input的此表中。问题在于数据类型&创建表时的定义。
在伪代码中,我想:
CREATE TABLE cur_output.schema.tablename
AS
SELECT a,b,1,2,decode(1,1,'2',2,3)
FROM cur_input.schema.tablename
WHERE 1=2
所有这一切都可以在没有:
的情况下完成首先必须在输入端创建表,然后使用DBMS_METADATA.get_ddl
使用Oracle的DBLINKS
...
cur_input.description中的条目似乎对此非常有用,但是我觉得将cur_input.description中的cx_Oracle.STRING直接转换为输出-DDL的VARCHAR2感觉不舒服,因为cx_Oracle.STRING可以转换为Oracle的:VARCHAR2 ,NVARCHAR2或LONG (完整翻译表:http://www.oracle.com/technetwork/articles/dsl/prez-python-queries-101587.html - 章节:数据类型)
提前致谢!
答案 0 :(得分:0)
答案很简单。使用cursor.description方式:可以明确地完成从cx_Oracle类型到Oracle数据类型的转换。我正在使用石器时代的文档是什么问题...
translator = { 'BINARY' : 'RAW',\
'BFILE' : 'BFILE',\
'BLOB' : 'BLOB',\
'CLOB' : 'CLOB',\
'CURSOR' : 'CURSOR',\
'DATETIME' : 'DATE',\
'FIXED_CHAR' : 'CHAR',\
'FIXED_UNICODE' : 'NCHAR',\
'INTERVAL' : 'INTERVAL',\
'LONG_STRING' : 'LONG',\
'LONG_UNICODE' : 'LONG ',\
'NCLOB' : 'NCLOB',\
'NUMBER' : "NUMBER",\
'OBJECT' : 'OBJECT',\
'ROWID' : 'ROWID',\
'STRING' : 'VARCHAR2',\
'TIMESTAMP' : 'TIMESTAMP',\
'UNICODE' : "NVARCHAR2" }
str_coltype # example: "<type 'cx_Oracle.NUMBER'>"
cx_coltp = re.findall("\.([^\.]+)'>$", str_coltype)[0]
ora_coltp = translator[ cx_coltp ]
事实证明,这里有一些顶级文档:
http://cx-oracle.readthedocs.org/en/latest/module.html#types