【问题标题】:failed to insert data from csv file to oracle using python无法使用 python 将数据从 csv 文件插入到 oracle
【发布时间】:2018-05-10 09:42:45
【问题描述】:

我打算使用 Python 和 Oracle 连接器将 csv 文件中的数据逐行插入到 oracle 数据库中, 但是对于太长的文本,我得到了一个错误

ORA-01704: 字符串文字太长

代码如下:

from time import gmtime, strftime

with open(path-to-csv-file) as f:
    reader=csv.DictReader(f,delimiter=',')
    for row in reader:
        today = strftime("%Y-%m-%d %H:%M:%S", gmtime())

        if len(row['answer']) < 2000: 

            ###[ The query in this part works]###  

            sqlquery="INSERT INTO TEST VALUES ('%s','%s')" %(row['answer'],today)
            cur.execute(sqlquery)

        else: 

            ###[ The query below got and error ORA-01704: string literal too long]###

            sqlquery="INSERT INTO TEST VALUES ('%s','%s')" %(row['answer'],today)
            cur.execute(sqlquery)

我在 stackoverflow 上搜索并尝试在 len(row["answer"]) 超过 2000 时将列名 TEST1 设置为更大的大小 与

cur.setinputsizes(TEST1 = cx_Oracle.CLOB)

但显然它不起作用,因为查询形式不同。

在else部分运行时:

        else: 
            sqlquery="INSERT INTO TEST VALUES ('%s','%s')" %(row['answer'],today)
            cur.setinputsizes(TEST1 = cx_Oracle.CLOB)
            cur.execute(sqlquery)

ORA-01036: 非法变量名/编号

被退回

另外,我试图将变量声明为 varchar2 来解决这个问题,但没有成功。 如果有人对此问题有更好的想法,我们将非常感谢您的帮助..

【问题讨论】:

    标签: python oracle csv


    【解决方案1】:

    我发现了这个... cx_Oracle 库提供了LOB object 在Oracle 中写入CLOB 对象。 阅读this one,但它是针对 2.X 的。

    【讨论】:

      【解决方案2】:

      首先,你得到了 ORA-1036,因为你的 sqlquery 没有任何变量。您正在尝试设置 TEST1 变量,但它在您的代码中的什么位置?使用变量,您的代码应类似于 INSERT INTO TEST VALUES (:TEST1, :TEST2);而不是这个,你为SQL injection 提供了很好的能力。

      关于更好的想法...至于我,没有理由对现有决定做出错误的复制。我只是使用Oracle SQL*Loader,它也可以加载 csv 文件。

      【讨论】:

      • 抱歉回复晚了。感谢您的回答,这解决了我的问题。
      猜你喜欢
      • 1970-01-01
      • 2021-10-02
      • 2022-11-29
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多