当前位置: 首页 > 知识库问答 >
问题:

将CLOB插入setinputsize()后会引发非法变量名称/编号

仲孙献
2023-03-14

我有一个甲骨文表,我试图从csv插入大量数据(大部分是长字符串)。

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

但不知何故,使用“setinputsizes()”打破了我的insert查询,我得到了“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()”行,上面的查询执行得很好-但是当我使用seq的实际值时,超过4000个字符,它会失败

DatabaseError: ORA-01704: string literal too long

但是使用“setinputsizes()”行,我得到

DatabaseError: ORA-01036: illegal variable name/number

(注意:我知道对大容量插入来说,执行程序更好。但是我在那里得到了同样的错误,所以我想先解决这个问题。)

有谁能告诉我我哪里出了问题以及如何解决?非常感谢。

共有3个答案

柯昱
2023-03-14

数据库错误: ORA-01036:非法变量名称/数字的原因是在错误的调用setinputsize()

正确的线应该是

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

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

这需要与要输入的值的位置绑定相结合,否则会出现数据库错误:ORA-01036:非法变量名称/编号

工作代码如下所示:

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()
花阳辉
2023-03-14

ORA-01704:string literal过长表示无法正确解析发送到数据库的查询,因为存在过长的标识符。该标识符可以是表名、列名、函数名(最大长度为30字节)。

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

钱志
2023-03-14

当使用超过4000个字符(或字节)的字符串文本插入或更新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;
/
 类似资料:
  • 你好,美丽的人们。 我正在尝试使用连接到OracleDB的node.js创建RESTAPI,但我正在竭尽全力让这些愚蠢的绑定变量正常工作。 这是我的代码: 由于某种原因,我得到了错误 如果我删除bind变量,分配一个静态值,并删除sql语句后的“req.params.ScheMA”,并将括号留空,它就可以工作。 我知道我拉绑定变量的方式一定很简单,但是我把头发拔出来了。 请帮帮我欧比万克诺比。。。

  • 请帮帮我 获取日期范围的数据时出错 错误 ora-01036非法变量名称/编号

  • 为什么在Oracle DB中出现此错误? cx_Oracle。ORA-01036:非法变量名称/数字

  • 我已经创建了一个API,希望将数据插入oracle数据库。但我收到一条错误消息“error:ORA-01036:非法变量名/编号”。我不知道我犯了什么错误。希望能帮我解决这个问题。先谢谢你。 [错误:ORA-01036:非法变量名/编号]{errorNum:1036,偏移量:0}

  • 我想更新gridview中的行的单元格。但我得到的错误是 ORA-01036:非法变量名称/编号 在 下面是我的代码:-

  • 我面临的问题,在更新表单视图值使用sqldatasSource绑定与Oracle数据库。 我的选择和插入事件工作正常,所有列和参数都正确。 但当我点击下面的更新按钮时,出现了错误: "ORA-01036:非法变量名称/数字" 以下是我在sqldatasource(与oracle绑定)中使用的更新命令: 我的问题解决了,因为我没有使用主键来匹配在哪里条件,当我用主键更改在哪里条件时,它开始工作。 在