cx_Oracle.DatabaseError:ORA-01722:无效的数字

时间:2016-03-01 18:42:14

标签: sql oracle python-2.7

任何人都可以帮我找到我从这段代码中收到无效号码错误的原因:

prcpId=cursor.var(cx_Oracle.NUMBER)

cursor.execute("""insert into PC_REROUTING_CONF_PCBS (PRCP_SOURCE_FC_PCB_ID,PRCP_TARGET_FC_PCB_ID,PRCP_MIN_ORDER_LINES,PRCP_MAX_ORDER_LINES) values ('+ str(sourcePcbId) +','+ str(targetPcbId) +', 1, 999)returning prcp_id INTO :v_prcp_id""", v_prcp_id = prcpId)

v_prcp_id=prcpId.getvalue()

print v_prcp_id

2 个答案:

答案 0 :(得分:0)

我认为你的查询字符串存在问题...尝试这样的事情,看看它是否有效:

sql_str = "insert into PC_REROUTING_CONF_PCBS (PRCP_SOURCE_FC_PCB_ID,PRCP_TARGET_FC_PCB_ID,PRCP_MIN_ORDER_LINES,PRCP_MAX_ORDER_LINES) values ('{0}','{1}', 1, 999) returning prcp_id INTO :v_prcp_id"
cursor.execute(sql_str.format(str(sourcePcbId),str(targetPcbId)), v_prcp_id = prcpId)

如果有效,请在生产中使用它。 :)使用绑定机制。总是。否则你可以SQL injection。{/ p>

答案 1 :(得分:0)

错误是由于您用于嵌入ID变量的引号:

values ('+ str(sourcePcbId) +','+ str(targetPcbId) +', 1, 999)

您的整体声明在客户端应用程序中用双引号括起来。您在值周围使用了单引号,因此您传递字符串文字而不是ID值;实际上和做的一样:

select to_number('+ str(sourcePcbId) +') from dual;

字符串文字显然不是数字。客户端中的sourcePcbIdtargetPcbId值在SQL语句中永远不可见,您只需要看起来与这些名称相同的字符串文字。

如果您要嵌入它们,那么您需要关闭客户端双引号:

values ("+ str(sourcePcbId) +","+ str(targetPcbId) +", 1, 999)

虽然我不确定你为什么在开头和结尾都有三个双引号,所以我不知道你是否需要在这里做同样的事情。

但是你不应该像这样嵌入这些值。使用绑定变量,就像您已经用于返回值一样。这将更有效,因为查询不会对每组值进行硬解析。更重要的是,它将帮助您避免SQL注入。