【问题标题】:ORA-06502: PL/SQL: numeric or value error: character string buffer too small - Convert Clob to varchar2ORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小 - 将 Clob 转换为 varchar2
【发布时间】:2015-10-21 15:02:54
【问题描述】:

我在尝试使用 api 将 clob 转换为 varchar2 时遇到此错误。

我试图检索的“body”字段是 clob,但是我想将其转换为 varchar2(1000)。

请告知发生此错误的原因:

       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:数字或值错误:字符串缓冲区太小

【问题讨论】:

  • 什么是完整的异常堆栈?其他 get_string 结果有多大 - 您是否已将范围缩小到评论?
  • 顺便说一句,与错误无关,但您不需要您的replace 电话;您可以在格式掩码中嵌入文字:to_date(json_ext.get_string(json(value(S)),'created_at'), 'YYYY-MM-DD"T"HH24:MI:SS"Z"').
  • 如果您单独运行USING 子句中的SELECT(即不作为上述MERGE 语句的一部分),它是否会成功执行?另外,请编辑您的问题并包括XXX 表的定义。谢谢。

标签: json oracle plsql clob


【解决方案1】:

问题在于该行: DBMS_LOB.SUBSTR(json_ext.get_string(json(value(S)),'body'),1000,1) 正文,

应该已经插入到 varchar2(1000) 中。

函数 DBMS_LOB.SUBSTR 无法正常工作。 由于特殊字符集(Json obj),字符串大于 CLOB 数据类型。

解决办法: 插入带有 clob 列的表(GTT),然后 substr 到 varchar2 XXX 表中。

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 2011-03-31
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 2018-03-16
    • 2015-05-16
    • 1970-01-01
    相关资源
    最近更新 更多