Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将CLOB转换为多个VARCHAR2行?_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 如何将CLOB转换为多个VARCHAR2行?

Sql 如何将CLOB转换为多个VARCHAR2行?,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个单栏评论,目前是CLOB。有没有办法在oracle SQL中将COMMENTS CLOB列拆分为单独的4k VARCHAR2列 提前谢谢 以下是我的尝试: create or replace procedure longsubstr(p_rowid in rowid, comment in comment) return varchar2

我有一个单栏评论,目前是CLOB。有没有办法在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;
                            /
:

:

你可以用

dbms_lob.substr clob_列,表示_多少个_字节,来自哪个_字节 作用

为此:

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;
你可以用

dbms_lob.substr clob_列,表示_多少个_字节,来自哪个_字节 作用

为此:

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;

通过带有动态代码的plsql,当然可以。动态,因为需要将varchar2列名注入查询。否则,如果只是在查询中获取值,您可以在CTEcan中执行此操作,您可以向我展示一个需要编写的代码示例?不幸的是,我这里没有oracle环境,我对它有点生疏。让我们看看其他人是否可以添加答案。不过,如果您提供任何尝试会更好。通过带有动态代码的plsql,您当然可以。动态,因为需要将varchar2列名注入查询。否则,如果只是在查询中获取值,您可以在CTEcan中执行此操作,您可以向我展示一个需要编写的代码示例?不幸的是,我这里没有oracle环境,我对它有点生疏。让我们看看其他人是否可以添加答案。如果你能尝试一下,那就更好了。非常感谢。你能向我解释一下你在第一个解决方案中做了什么吗?如果不是的话,我仍然会把你的答案标记为最好的答案,但任何帮助都将不胜感激。我不完全理解为什么您决定执行笛卡尔连接,并最终获得值“1”,用作substr函数中的列值。你不能用“1”来代替吗?笛卡尔式连接获取该值有什么好处?@icerabbit生成一个由分层查询填充的VARRAY,以给出值140018001,。。。直到每个CLOB和每个VARRAY的长度,然后将其关联到相应的行,并连接回原始表,用于从该位置开始获得4000个字符的子字符串。非常感谢。你能向我解释一下你在第一个解决方案中做了什么吗?如果不是的话,我仍然会把你的答案标记为最好的答案,但任何帮助都将不胜感激。我不完全理解为什么您决定执行笛卡尔连接,并最终获得值“1”,用作substr函数中的列值。你不能用“1”来代替吗?笛卡尔式连接获取该值有什么好处?@icerabbit生成一个由分层查询填充的VARRAY,以给出值140018001,。。。直到每个CLOB和每个VARRAY的长度,然后将其关联到适当的行并连接回原始表,并用于从该位置开始获取4000个字符的子字符串。
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;