Sql 如何将CLOB转换为多个VARCHAR2行?
我有一个单栏评论,目前是CLOB。有没有办法在oracle SQL中将COMMENTS CLOB列拆分为单独的4k 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
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;