oracle - ORA-01461 (with > 4k varchar2) 错误 仅在合并语句中。插入或更新工作正常

标签 oracle plsql oracle11g merge ora-01461

这是我的线索... 我用的是oracle 11g。搜索了很多,但没有找到。

我需要执行DML操作,它可以包含> 4k字符的数据。

如果我直接在oracle中使用sql block ,就像下一个一样,一切正常

declare 
  txtV varchar2(32000);
BEGIN 
  txtV:= 'MORE THAN 4k CHARS, here only few for readability' ; 
  Update FD_FILTERDEF 
     set SQLFILTER = txtV 
   where id='blabla';  
END;
但是!!! 如果我使用合并语句,它会给我错误ORA-01461

declare 
  txtV varchar2(32000);
BEGIN 
  txtV:= '' ; 
  MERGE INTO FD_FILTERDEF A 
        USING ( select  txtV C0 
                  from dual) ST 
           ON (A.CODE = 'bla bla') 
  WHEN MATCHED THEN 
    Update set A.SQLFILTER = st.C0  
  WHEN NOT MATCHED THEN 
    insert (CODE  ,SQLFILTER ) 
      values ('bla bla'  , ST.C0  );  
END; 

如果有一些提示,我们将不胜感激:)

最佳答案

使用这个:

create table fd_filterdef
( code varchar2(10) primary key
, sqlfilter clob );

declare
    txtv varchar2(32000);
begin
    txtv := rpad('select statement, really really long', 5000, ' etc');

    merge into fd_filterdef a
    using (select 'bla bla' as code from dual) st
    on (a.code = st.code)
    when matched then
        update set a.sqlfilter = txtv
    when not matched then
        insert (code, sqlfilter)
        values (st.code,txtv);
end;
/

select code, length(sqlfilter) from fd_filterdef;

CODE       LENGTH(SQLFILTER)
---------- -----------------
bla bla                 5000

从 Dual 中选择 long 变量会将其隐式转换为 SQL varchar2,在 12c 之前,该变量最多只能容纳 4000 个字节。

关于oracle - ORA-01461 (with > 4k varchar2) 错误 仅在合并语句中。插入或更新工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38463857/

相关文章:

java - 插入 BLOB 失败,文件为 NULL

sql - PL/SQL 是否具有与 Java 等效的 StringTokenizer?

sql - Oracle函数: How to pass a table name as parameter,并使用游标结果作为表名?

oracle - 如何使用 Application Express 删除 Oracle XE 11.2 中的所有表?

Python:直接从 Pandas 加载 Oracle 表(写入 Oracle)

LINQ-to-XYZ 多态性?

xml - 甲骨文 PL/SQL : Loop through XMLTYPE nodes

oracle - 从标识列的支持序列中获取 nextval

sql - 将 PL/SQL 代码运行到 Oracle 11g Express Edition - 错误

oracle - 我在 ORACLE 安装路径中找不到 NETWORK\ADMIN 文件夹