【问题标题】:How to convert CLOB into multiple VARCHAR2 rows?如何将 CLOB 转换为多个 VARCHAR2 行?
【发布时间】:2017-11-08 20:03:13
【问题描述】:

我有一个当前是 CLOB 的列 (COMMENTS)。有没有办法可以在 oracle SQL 中将 COMMENTS CLOB 列拆分为单独的 (4k) VARCHAR2 列?

提前致谢

下面是我的尝试:

create or replace procedure longsubstr(p_rowid in rowid,
                                       comment in comment)
                            return varchar2
                            as l_tmp long;
                            begin
                            select COMMENT into l_tmp from table_name 
                                                     where rowid = p_rowid;
                            return substr(l_tmp, p_form, p_for);
                            end;
                            /

【问题讨论】:

  • 通过带有动态代码的plsql,当然可以。动态,因为您需要将 varchar2 列名注入到查询中。否则,如果只是为了获取查询中的值,您可以在 CTE 中进行
  • 你能给我看一个需要编写的代码示例吗?
  • 很遗憾我这里没有oracle环境,对它有点生疏。让看看其他人是否可以添加答案。不过,如果您提供任何尝试会更好。

标签: sql oracle oracle11g


【解决方案1】:

SQLFIDDLE:

SELECT DBMS_LOB.SUBSTR( t.comments, 4000, l.COLUMN_VALUE )
FROM   table_name t
       CROSS JOIN
       TABLE(
         CAST(
           MULTISET(
             SELECT LEVEL * 4000 - 3999
             FROM   DUAL
             CONNECT BY LEVEL * 4000 - 3999 <= DBMS_LOB.GETLENGTH( t.comments )
           ) AS SYS.ODCINUMBERLIST
         )
       ) l

WITH positions ( comments, pos ) AS (
  SELECT comments,
         1
  FROM   table_name
UNION ALL
  SELECT comments,
         pos + 4000
  FROM   positions
  WHERE  pos + 4000 <= DBMS_LOB.GETLENGTH( comments )
)
SELECT DBMS_LOB.SUBSTR( comments, 4000, pos ) AS split_comment
FROM   positions

【讨论】:

  • 非常感谢。你能解释一下你在第一个解决方案中做了什么吗?如果不是,我仍会将您的答案标记为最佳答案,但任何帮助将不胜感激。我不完全理解为什么您决定执行笛卡尔连接最终会得到您用作 substr 函数中的列值的值“1”。你不能只使用'1'吗?笛卡尔连接获得该值有什么好处?
  • @icerabbit 它会生成一个由分层查询填充的VARRAY,以将值1,4001,8001,... 提供到每个CLOB 的长度,然后将每个VARRAYs 与适当的行并连接回原始表并用于获取从该位置开始的 4000 个字符的子字符串。
【解决方案2】:

你可以使用

dbms_lob.substr( clob_column, for_how_many_bytes, from_which_byte ) 功能

为此:

declare
    type typ_comment is table of varchar2(4000);
    v_varchar typ_comment := typ_comment();
    v_clob    table_name.comments%type;
    k         number;
    j         number := 4000;
begin
    select comments into v_clob from table_name where rowid = '&p_rowid'; -- like AAAS9BAAEAAAAEeAAA without quotation
    k := ceil(dbms_lob.getlength(v_clob)/j);
    v_varchar.extend(k); 
  for i in 1..k 
  loop
    v_varchar(i):= dbms_lob.substr( v_clob, j, 1 + j * ( i - 1 ) );
  end loop;
end;

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 2012-10-03
    • 1970-01-01
    • 2013-11-07
    • 2019-09-23
    • 2012-10-02
    • 2017-01-17
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多