cx_Oracle.DatabaseError: ORA-00904: "DATETIME"."DATETIME": invalid identifier

cx_Oracle.DatabaseError: ORA-00904: "DATETIME"."DATETIME": invalid identifier

我正在尝试使用 Python 的 cx_Oracle 导出 Oracle 数据库。我连接到数据库,查询我需要的所有行,然后用它们构建一个 INSERT 语句。 我正在使用与此类似的代码:

table_name = "AUDIT"
where_clause = "id > 10"
query = "SELECT * FROM " + table_name + " WHERE " + where_clause
curs = db_conn.cursor()
curs.execute(query)
res = curs.fetchall()
columns = []
for i in range(0, len(curs.description)):
    columns.append(curs.description[i][0])
column_names = ",".join(columns)
statement = "INSERT INTO %s (%s) VALUES %s" % (table_name, column_names, row)
print statement

类型是 NUMBER、VARCHAR2、DATE、NUMBER,我得到一个看起来不错的插入语句...除了日期字段:

INSERT INTO AUDIT_LOG (LOG_DBID,USER_NAME,EVENT_DATE,SEVERITY) VALUES ('AUDIT_LOG_SQ.nextval', 'user@do',datetime.datetime(2018, 4, 28, 1, 57, 42), '1')

当我尝试执行它时,无论是通过 sqlplus 还是同一个游标,我都收到以下错误:

Error starting at line 1 in command:
INSERT INTO AUDIT_LOG (LOG_DBID,USER_NAME,EVENT_DATE,SEVERITY) VALUES ('AUDIT_LOG_SQ.nextval', 'SYSTEM@do',datetime.datetime(2018, 4, 28, 1, 57, 42), '1')
Error at Command Line:1 Column:95
Error report:
SQL Error: ORA-00904: "DATETIME"."DATETIME": invalid identifier
00904. 00000 -  "%s: invalid identifier"

没有日期时间元素,查询工作正常。 如何插入从游标获得的结果?

我检查了 SQL_Developer 出口与我的比较,他们有不同的处理方式:

INSERT INTO AUDIT_LOG (LOG_DBID,USER_NAME,EVENT_DATE,SEVERITY) VALUES ('AUDIT_LOG_SQ.nextval', 'user@do',to_timestamp('25-APR-18','DD-MON-RR HH.MI.SSXFF AM'), '1')

我还没有真正找到复制的方法(没有将整个查询变成丑陋的字符串连接),而且我不确定我是否需要 - 一定是我遗漏了什么!

任何帮助将不胜感激,谢谢!

我不知道你在做什么,但是-至于5个小时没有答案,让我说一两句话。

这是一条失败的语句:

INSERT INTO AUDIT_LOG (LOG_DBID,USER_NAME,EVENT_DATE,SEVERITY) VALUES 
('AUDIT_LOG_SQ.nextval', 'SYSTEM@do',datetime.datetime(2018, 4, 28, 1, 57, 42), '1')

您希望 datetime.datetime 是什么?对我(大概还有 Oracle)来说,它看起来好像有一个名为 datetime 的用户(第一个,在点前面),它有一个名为 datetime 的函数(第二个, 在点后面)。很可能这两个都不是真的,是吗?

我建议您尝试使用 TO_DATE 函数,它接受两个参数:日期(和时间)和适当的格式掩码,例如

to_date('2018-04-28 01:57:42', 'yyyy-mm-dd hh24:mi:ss')

你可以用它来代替你的 datetime 结构。

但是,我担心 - 即使您这样做 - INSERT 可能会因为您插入的第一个值而再次失败。

LOG_DBID 看起来像 IDNUMBER 数据类型);是吗? INSERT 您写的是试图向其中插入一个字符串 - 因为您将其括在单引号中:'audit_log_sq.nextval'AUDIT_LOG_SQ 是序列名。因此,如果您想在该列中插入数值,则应省略单引号。

最后,可能 起作用(至少在 Oracle 本身)的声明如下所示:

INSERT INTO AUDIT_LOG (LOG_DBID,USER_NAME,EVENT_DATE,SEVERITY) VALUES 
(AUDIT_LOG_SQ.nextval, 
 'SYSTEM@do', 
  to_date('2018-04-28 01:57:42', 'yyyy-mm-dd hh24:mi:ss'), 
 '1')

我希望它有意义,即使在您的上下文中也是如此。

SQL Error: ORA-00904: "DATETIME"."DATETIME": invalid identifier

您收到此错误是因为 datetime.datetime 不是有效的 Oracle 语法。您有点知道,因为您知道 Oracle SQL 开发人员如何格式化时间戳。但是您不想复制显式 to_timestamp() 逻辑。

我不清楚你从哪里得到 EVENT_DATE 的值,但考虑到这是一个审计函数,也许你需要的是 sysdate ,一个内置的 Oracle给我们当前的日期和时间。