【问题标题】:ORA-00936: missing expression with Python and Oracle on insertORA-00936: 插入时缺少 Python 和 Oracle 的表达式
【发布时间】:2020-06-18 17:56:01
【问题描述】:

我花了很多天试图找出 ORA-00936:使用 executemany() 时缺少表达式错误。如果我一次插入一行,则插入有效。 我已经搜索、阅读并尝试了在互联网上找到的建议,但它们似乎都不起作用。 我需要帮助。 这是表格说明:

ColumnName,ColID,PK,IndexPos,Null,DataType,Default,DefaultOnNull,Histogram,NumDistinct,NumNulls,Density,EncryptionAlg,Salt,Trigger,Virtual
YEARMONTH,1,1,1,N,DATE,,False,None,1997,0,0.0005,,,,False
PHASE,4,,,Y,VARCHAR2 (7 Char),,False,Frequency,5,0,0.00013,,,,False
INDEXVALUE,3,,,Y,NUMBER (3,2),,False,None,728,0,0.00137,,,,False
CLIMATEINDEX,2,2,2,N,VARCHAR2 (4 Char),,False,Frequency,3,0,0.00013,,,,False

使用 python 的 csv 阅读器从 csv 文件中读取数据并将其放入列表中。 这是数据:

file_data = [['1854-01-01', 'PDO', '0.11', 'POS'], ['1854-02-01', 'PDO', '-0.24', 'NEG'], ['1854-03-01', 'PDO', '-0.4', 'NEG'], ['1854-04-01', 'PDO', '-0.44', 'NEG'], ['2020-04-01', 'ONI', '0.28', 'NEUTRAL'], ['2020-04-01', 'PDO', '-1.33', 'NEG'], ['2020-05-01', 'PDO', '-0.7', 'NEG']]

这是插入sql:

in_query = ('insert into myschema.monthly_climate_index(YEARMONTH, CLIMATEINDEX, INDEXVALUE, PHASE) values (DATE :YEARMONTH, :CLIMATEINDEX, :INDEXVALUE, :PHASE)')

这是执行多次命令:

cursor.executemany(in_query, file_data)

结果是:ORA-00936:缺少表达式 谢谢!!!

【问题讨论】:

    标签: python sql oracle


    【解决方案1】:

    这是您的查询:

    insert into myschema.monthly_climate_index
      (YEARMONTH, CLIMATEINDEX, INDEXVALUE, PHASE) values 
      (DATE :YEARMONTH, :CLIMATEINDEX, :INDEXVALUE, :PHASE)
       ---------------
       ^^^ this
    

    我不认为你可以那样使用日期; date 关键字看起来好像你想插入一个日期文字,例如date '2020-06-18'。如果是这样,everything 应该是 :YEARMONTH 的一部分。

    【讨论】:

    • 你说得对,谢谢!我不能以这种方式使用“日期”。我试过这个,TO_DATE(:YEARMONTH,'yyyy-mm-dd') 并且成功了..
    • 太棒了!我很高兴你修好了。感谢您告知我们。
    【解决方案2】:

    试试这个:

    将您的 SQL 更新为:

    in_query = """ insert into myschema.monthly_climate_index(YEARMONTH, CLIMATEINDEX, INDEXVALUE, PHASE) values (:1, :2, :3, :4) """
    

    如果这仍然不起作用,请尝试将您的列表更改为像这样的元组数组

    [('1854-01-01', 'PDO', '0.11', 'POS')]
    

    此外,Oracle 日期很难处理。因此,如果日期兼容性是问题,请尝试将日期字符串文字更改为以下内容:

    '01-JAN-1854'
    

    而不是

    '1854-01-01'
    

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多