【问题标题】:cx-oracle sql insert query raise error when : (semicolon) insert into querycx-oracle sql 插入查询时引发错误:(分号)插入查询
【发布时间】:2020-12-29 06:49:34
【问题描述】:
dsn_tns = cx_Oracle.makedsn('myip', '1521', service_name='myservicename')
connection = cx_Oracle.connect(user='username', password='passwd', dsn=dsn_tns) 
cursor = connection.cursor()
cursor.execute("INSERT INTO  tablename VALUES (7.4)")
    #above works ok
cursor.execute("INSERT INTO  tablename VALUES (7:4)")
    #above sql raise cx_Oracle.DatabaseError: ORA-00917: missing comma
connection.commit()
connection.close()

我的要求是在这个表名中插入:,这个表名的列类型是varchar2。 (当我插入“0001”时,它还会删除前导零,并且只在 tabename 中插入“1”) 以上代码连接oracle数据库表并创建游标以执行sql插入查询。在插入查询中,如果成功更新表,则值为 7.4,但在第二次插入时会引发 ORA-00917 错误。 我正在使用 oracle 版本 11g 和 python 3.7。

【问题讨论】:

  • 那么tablename 应该是一个只有一列数字类型的表,因此7:4 没有意义。
  • @BarbarosÖzhan 感谢您的回复,但它似乎是其他问题,因为表列是 varchar2 类型并且旁边:(分号)它也无法插入前导零。
  • 不客气。如果数据类型是 varchar,那么你应该引用它'7:4'7.4 被隐式认为是一个数值,在插入 varchar 类型列时不会遇到问题,但是相反的情况(char to numeric)可能不会成功
  • @BarbarosÖzhan 你是对的,它适用于 '7:4',但是当我使用变量 cx_Oracle.DatabaseError: ORA-00936: missing expression myvar='7:4' cursor.execute ('INSERT INTO tablename(col1) VALUES ({myvar})')
  • 现在,单引号中的单引号会引发错误。

标签: python python-3.x oracle sql-insert cx-oracle


【解决方案1】:

因为,第一种情况下的值可以分类为数字类型,可以插入到字符串类型列中。将其转换为准备好的语句,例如

myvar=7.4
cursor.execute("INSERT INTO tab(col) VALUES (:1)",[myvar]) 

不能用于7:4,它似乎没有被隐式转换为已知数据类型。该值应该被引用7:4,并且适合这种情况的格式化,例如

myvar='7:4'
cursor.execute("INSERT INTO tab(col) VALUES (:1)",[myvar.format('{}')])

因此,在这两种情况下都更愿意使用第二个而不会有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多