Sql cx_Oracle.DatabaseError:ORA-00904:“;“日期时间”&引用;日期时间“无效的标识符
我正在尝试使用Python的cx_Oracle导出Oracle数据库。我连接到DB,查询我需要的所有行,然后用它们构建一个INSERT语句。 我使用的代码与此类似:Sql cx_Oracle.DatabaseError:ORA-00904:“;“日期时间”&引用;日期时间“无效的标识符,sql,oracle,python-2.7,cx-oracle,python-datetime,Sql,Oracle,Python 2.7,Cx Oracle,Python Datetime,我正在尝试使用Python的cx_Oracle导出Oracle数据库。我连接到DB,查询我需要的所有行,然后用它们构建一个INSERT语句。 我使用的代码与此类似: table_name = "AUDIT" where_clause = "id > 10" query = "SELECT * FROM " + table_name + " WHERE " + where_clause curs = db_conn.cursor() curs.execute(query) res = cur
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语句。。。除日期字段外:
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"
如果没有datetime元素,查询就可以正常工作。
如何插入从光标获得的结果?
我检查了SQL_开发者导出以与我的进行比较,他们有不同的处理方式:
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\u DBID
看起来像一个ID
(NUMBER
数据类型);是吗INSERT
您编写的代码试图在其中插入一个字符串,因为您将其括在单引号中:'audit\u log\u sq.nextval'
AUDIT\u LOG\u 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')
我希望这是有道理的,即使是在你的背景下。我不知道如何做你正在做的事情,但是-至于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\u DBID
看起来像一个ID
(NUMBER
数据类型);是吗INSERT
您编写的代码试图在其中插入一个字符串,因为您将其括在单引号中:'audit\u log\u sq.nextval'
AUDIT\u LOG\u 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错误:ORA-00904:“日期时间”。“日期时间”:无效标识符
出现此错误是因为datetime.datetime
不是有效的Oracle语法。您知道这一点,因为您知道Oracle SQL Developer如何格式化时间戳。但是您不想将显式复制到\u timestamp()
逻辑
我不清楚EVENT_DATE的值是从何处获得的,但考虑到这是一个审计函数,您可能需要的是sysdate
,一个Oracle内置程序,它为我们提供当前日期和时间
SQL错误:ORA-00904:“日期时间”。“日期时间”:无效标识符
出现此错误是因为datetime.datetime
不是有效的Oracle语法。您知道这一点,因为您知道Oracle SQL Developer如何格式化时间戳。但是您不想将显式复制到\u timestamp()
逻辑
我不清楚EVENT_DATE的值是从何处获得的,但考虑到这是一个审计函数,您可能需要的是
sysdate
,一个Oracle内置程序,它为我们提供当前日期和时间 @a.pet以及以上内容,请确保使用绑定变量,这对于性能和安全性非常重要。请参阅示例,例如您可以将变量与绑定到日期
一起使用,例如绑定到日期(:bv,'yyyy-mm-dd')
等。@Littlefoot非常感谢您注意到.nextval问题!太糟糕了,我现在才看到它(我最终在家里解决了它,但还没有更新这个问题),但简言之——问题是以字符串表示的序列和为null的值——python将它们写为None(显然),然后插入失败,因为SQL不知道什么是None。我还最终用to_timestamp替换了所有的datetime.datetime(我不得不使用regex,因为在我可以更改它的时候它已经是一个字符串),现在它可以正常工作了。谢谢大家!@a、 除了上面提到的,还要确保使用绑定变量,这对于性能和安全性来说是至关重要的。请参阅示例,例如您可以将变量与绑定到日期
一起使用,例如绑定到日期(:bv,'yyyy-mm-dd')
等。@Littlefoot非常感谢您注意到.nextval问题!可惜我只