【问题标题】:cx_Oracle CREATE TABLE AS returns ORA-01036: illegal variable name/numbercx_Oracle CREATE TABLE AS 返回 ORA-01036: 非法变量名称/编号
【发布时间】:2014-05-02 17:07:49
【问题描述】:

我正在尝试在 Python 2.4.6 上使用 cx_Oracle 创建 TABLE AS

以下代码:

    query = '''CREATE TABLE TMP_STATS_1 AS
    select NUM from INF_CARD where IMPORT_DATE between
    to_date(:datepass || ' 00:00:00','dd/mm/yyyy hh24:mi:ss') and
    to_date(:datepass || ' 23:59:59','dd/mm/yyyy hh24:mi:ss')'''
    curs.execute(query, datepass=datep)

返回:cx_Oracle.DatabaseError: ORA-01036: 非法变量名/编号

取出CREATE TABLE TMP_STATS_1 AS 并只留下SELECT 语句,效果很好。此外,当在 SQLPLUS 上使用CREATE TABLE AS 语句时,它可以正常运行。

CREATE TABLE AS 有什么特定的语法可以在 cx_Oracle 中使用吗?试图找到这方面的例子,但目前还没有找到。

【问题讨论】:

  • datep 是日期还是 varchar?只是猜测您可能正在传递日期,而查询需要 dd/mm/yyyy 格式的 varchar,该格式由 to_date 显式转换。
  • datep 用 datetime.now().strftime('%d/%m/%Y') 测试了,没有运气

标签: python sql oracle solaris cx-oracle


【解决方案1】:

你最好在Oracle中创建一个可以创建你的表的过程,然后从Python中调用这个过程:

create or replace procedure my_pro(p_table_name in varchar2, p_date_pass in date) as
 q1 varchar2(4000);
begin

 q1 := 'CREATE TABLE '|| p_table_name ||' AS
 select NUM from INF_CARD where IMPORT_DATE between
 trunc('||p_date_pass||') and trunc('||p_date_pass||') + 1 - (1/24/60/60)';

 EXECUTE IMMEDIATE q1;
end;

然后从 Python 调用该过程:

import cx_Oracle
con = cx_Oracle.connect('###YourPath###')
cur = con.cursor()
cur.callproc('my_pro', ('TMP_STATS_1', datep))
cur.close()
con.close()

【讨论】:

  • 在ORACLE中创建过程的正确语法是:CREATE PROCEDURE my_pro(p_statement in varchar2) as q1 varchar2(4000);开始 q1 := p_statement;立即执行 q1;结尾; /
猜你喜欢
  • 1970-01-01
  • 2013-01-06
  • 2011-10-05
  • 1970-01-01
  • 2020-07-29
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多