【问题标题】:inserting CLOB after setinputsizes() raises illegal variable name/number在 setinputsizes() 之后插入 CLOB 会引发非法变量名称/编号
【发布时间】:2015-08-14 23:58:49
【问题描述】:

我有一个 oracle 表,我正在尝试将大量数据(主要是长字符串)从 csv 插入。

我发现我的字符串需要使用 CLOB 数据类型,因为它们通常超过 4000 个字符。我还发现我需要使用“setinputsizes()”函数,否则会遇到“ValueError: string data too large”。

但不知何故,使用“setinputsizes()”会破坏我的插入查询,我得到“ORA-01036: 非法变量名称/编号”?

例子:

create_query = "CREATE TABLE sequences (myid varchar(10), allele varchar(50), seq clob)"
cursor.execute (create_query)
cursor.setinputsizes(seq = cx_Oracle.CLOB)
insert_query = "INSERT INTO sequences (myid, allele, seq) VALUES ('00001;', 'HLA-A*01:01:01:01', 'CGCTGACCTGTG')" # seq truncated; in truth it's much longer hence the CLOB type
cursor.execute(insert_query)

没有 'setinputsizes()' 行,上面的查询执行得很好 - 但是当我使用超过 4000 个字符的 seq 的实际值时,它会失败

DatabaseError: ORA-01704: string literal too long

但是使用 'setinputsizes()' 行,我得到了

DatabaseError: ORA-01036: illegal variable name/number

(注意:我知道 executemany 更适合批量插入。但我在那里遇到了同样的错误,所以我先尝试解决这个问题。)

谁能告诉我做错了什么以及如何解决? 谢谢!

【问题讨论】:

    标签: python oracle cx-oracle


    【解决方案1】:

    当使用超过 4,000 个字符(或字节)的字符串文字插入或更新 CLOB 时,您需要将该字符串文字分配给 PL/SQL 变量,然后在 PL/SQL 块中插入或更新该表.

    例子:

    DECLARE
        l_seq CLOB;
    BEGIN
        l_seq := 'CGCTGACCTGTG.....CGCTGACCTGTG';
    
        INSERT INTO sequences (myid, allele, seq) VALUES ('00001;', 'HLA-A*01:01:01:01', l_seq);
    END;
    /
    

    【讨论】:

    • 这有助于解决string literal too long 错误,并且使用您的代码,单个查询可以很好地执行长序列和短序列。但是,由于 seq 的各个值差异很大,因此我遇到了here 描述的问题。事实证明,我的代码的核心问题是错误调用 setinputsizes。正确使用它可以使代码在没有 PL/SQL 块的情况下工作。我添加了一个单独的答案来涵盖这一点。不过,感谢您教我一些 PL/SQL。 :)
    【解决方案2】:

    ORA-01704: string literal too long 表示您发送到数据库的查询由于某些标识符太长而无法正确解析。 该标识符可以是表名、列名、函数名(最大长度30字节)。

    还要确保您的 seq 列没有转义问题(' 出现在未转义的字符串中)。

    【讨论】:

      【解决方案3】:

      DatabaseError: ORA-01036: illegal variable name/number的原因在于setinputsizes()的错误调用。

      正确的行应该是

      cursor.setinputsizes(None, None, cx_Oracle.CLOB)
      

      因为setinputsizes() 需要同时为所有绑定变量设置(以正确的顺序!),而不是单独设置。

      这需要与要输入的值的位置绑定相结合,否则会有DatabaseError: ORA-01036: illegal variable name/number

      工作代码如下所示:

      create_query = "CREATE TABLE sequences (myid varchar(10), allele varchar(50), seq clob)"
      cursor.execute (create_query)
      cursor.setinputsizes(None, None, cx_Oracle.CLOB)
      insert_query = "INSERT INTO sequences (myid, allele, seq) VALUES (:1, :2, :3)" # seq truncated; in truth it's much longer hence the CLOB type
      cursor.execute(insert_query, ['HLA00001;', 'HLA-A*01:01:01:01', seq])
      conn.commit()
      

      【讨论】:

        猜你喜欢
        • 2013-01-06
        • 2011-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 2020-07-29
        • 2016-04-03
        相关资源
        最近更新 更多