cx_Oracle CREATE TABLE AS returns ORA-01036: illeg

2019-08-12 03:26发布

问题:

I'm trying to CREATE TABLE AS using cx_Oracle on Python 2.4.6

The following code:

    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)

Returns: cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number

Taking out the CREATE TABLE TMP_STATS_1 AS and leaving only the SELECT statement, works perfectly. Also, when using CREATE TABLE AS statement on SQLPLUS it runs correctly.

Is there any specific syntax for CREATE TABLE AS to be used in cx_Oracle? Tried to find examples for this, but none found so far.

回答1:

You are better off creating a procedure in Oracle that can create your table, and then call the procedure form 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;

and then call the procedure from Python:

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