cx_Oracle CREATE TABLE AS 返回 ORA-01036: 非法变量名称/数字

1 投票
1 回答
2263 浏览
提问于 2025-04-18 05:09

我正在尝试在 Python 2.4.6 中使用 cx_Oracle 来创建一个表。

以下是我的代码:

    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 语句时,它也能正确运行。

在 cx_Oracle 中使用 CREATE TABLE AS 有什么特定的语法吗?我试着找了一些例子,但到目前为止没有找到。

1 个回答

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()

撰写回答