如何从cursor.description或select-statement创建DDL

时间:2015-03-11 20:46:05

标签: python oracle oracle11g cx-oracle

使用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

  • 从中获取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 - 章节:数据类型)

提前致谢!

1 个答案:

答案 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