Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql cx_Oracle.DatabaseError:ORA-00904:“;“日期时间”&引用;日期时间“无效的标识符_Sql_Oracle_Python 2.7_Cx Oracle_Python Datetime - Fatal编程技术网

Sql cx_Oracle.DatabaseError:ORA-00904:“;“日期时间”&引用;日期时间“无效的标识符

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

我正在尝试使用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 = 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问题!可惜我只