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
看起来像 ID
(NUMBER
数据类型);是吗? 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给我们当前的日期和时间。
我正在尝试使用 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
看起来像 ID
(NUMBER
数据类型);是吗? 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给我们当前的日期和时间。