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

ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小-将Clob转换为varchar2

公孙弘深
2023-03-14
       MERGE INTO XXX D
                 USING (
                       select  
                              v_ticket_id ticket_id,
                              json_ext.get_number(json(value(S)),'id') comment_id,
                              json_ext.get_number(json(value(S)),'author_id') author_id , 
                              DBMS_LOB.SUBSTR(json_ext.get_string(json(value(S)),'body'),1000,1) body,
                              json_ext.get_string(json(value(S)),'via.channel')channel,
                              case when lower(json(value(S)).get('public').to_char()) = 'true' then 1 else 0 end  is_public,
                              to_date(replace(replace(json_ext.get_string(json(value(S)),'created_at'),'T',' '),'Z',null), 'YYYY-MM-DD HH24:MI:SS') created_at,
                              sysdate
                              FROM table(PKG.sf_retreive_data('RETREIVE').list_data) S) S

                ON (D.ticket_id = S.ticket_id and D.comment_id = S.comment_id)

                WHEN MATCHED THEN          
                      UPDATE SET   author_id = S.author_id,
                                   body = S.body,
                                   channel = S.channel,
                                   is_public = S.is_public,
                                   created_at = S.created_at, 
                                   bi_updated_time = sysdate

                WHEN NOT MATCHED THEN          
                      insert (ticket_id,comment_id,author_id ,body,channel,is_public,created_at,bi_updated_time)
                      values
                             (S.ticket_id,S.comment_id,S.author_id,S.body,S.channel,S.is_public,S.created_at,sysdate);
               commit;  

我得到这样的错误:错误:ORA-06502:PL/SQL:数值或值错误:字符串缓冲区太小

共有1个答案

燕扬
2023-03-14

问题是行:dbms_lob.substr(json_ext.get_string(json(value(S)),'body'),1000,1)body,

应已插入varchar2(1000)中。

函数dbms_lob.substr不能正常工作。由于特殊的字符集(Json、obj),字符串比CLOB数据类型大。

 类似资料:
  • 我以不同的方式尝试了以下代码,比如去掉while或if,但是当我把它们放在一起(if和while)时,我总是在最后得到错误。。。 错误: 通过将变量“a”的声明方式更改为: *注意,这里的显著变化是使用VARCHAR2而不是CHAR(不是更大的长度)。根据@user272735的回答,这是关键。

  • 我在下面的字段上得到字符串缓冲区太小的错误。 位于导致错误的select语句中。它是数据类型。

  • 我完全震惊了,不明白我需要做什么来修复这个错误。我有一个plsql过程,它接受一个varchar2字符串和一个OUT参数,这是一个数字。你能帮我学习plsql和php吗。 member_name列类型为VARCHAR2(100),member_id为NUMBER(20) 我从php执行上述存储过程,如下所示 这是我在php中看到的输出 字符串整数警告:oci_execute()[function.

  • 我在游标循环中连接varchar2数据类型时遇到了问题。 过程在循环中迭代,以生成用于批处理的插入和删除操作的in子句。该过程将对每1000个帐号批处理运行。 有没有其他方法可以做到这一点?

  • 有没有办法在mybatis结果映射中指定一个字符串最多应包含20个字符?或者如何设置精度,如数字(4,2)? 例如,我有一个如下所示的结果图: 我可以将int的位数限制为只有1,在浮点数上的“.”后面显示N个元素,或者将字符串大小限制为一定的数字吗? 我正在处理的视图具有以下列结构: 编辑1:每当我试图调用存储过程在此视图中添加新项时...我会得到这个错误: 我创建了一个用于测试的类,该类尝试调用

  • 在函数中,我在这一行上有ORA-06502错误: 我看这里没有任何转换问题/完全困惑/