Oracle中如何将动态查询数据导入CLOB列
我想将select查询数据作为逗号分隔的值插入CLOB列。下面是我为此创建的匿名块。 我正在使用dbms_sql获取所有表头。现在,我想对表行执行相同的操作,以便它可以处理任何查询。我陷入了逻辑。任何帮助都将不胜感激Oracle中如何将动态查询数据导入CLOB列,oracle,plsql,Oracle,Plsql,我想将select查询数据作为逗号分隔的值插入CLOB列。下面是我为此创建的匿名块。 我正在使用dbms_sql获取所有表头。现在,我想对表行执行相同的操作,以便它可以处理任何查询。我陷入了逻辑。任何帮助都将不胜感激 declare l_clob clob; l_row varchar2(4000); v_sql varchar2(32767) := 'select * from all_tables'; out varchar2(6000); out2 varchar2(6000);
declare
l_clob clob;
l_row varchar2(4000);
v_sql varchar2(32767) := 'select * from all_tables';
out varchar2(6000);
out2 varchar2(6000);
v_cursor_id integer;
v_col_cnt integer;
v_columns dbms_sql.desc_tab;
begin
v_cursor_id := dbms_sql.open_cursor;
dbms_sql.parse(v_cursor_id, v_sql, dbms_sql.native);
dbms_sql.describe_columns(v_cursor_id, v_col_cnt, v_columns);
-- get header data
for i in 1 .. v_columns.count loop
out:= v_columns(i).col_name;
out2:=out2||','||out;
end loop;
out2:= LTRIM(out2,',') ||chr(10);
dbms_lob.createtemporary(l_clob, true);
dbms_lob.writeappend (l_clob, length(out2), out2);
--get table rows
--DBMS_SQL.FETCH_ROWS ??
-- for i in ( select * from user_tables ) loop
--l_row := i.table_name||','||i.num_rows||','||i.blocks||chr(10);
--dbms_lob.writeappend (l_clob, length(l_row), l_row); end loop;
insert into convert_clob values ('demo.csv' ,'application/vnd.ms-excel',l_clob ); -- l_clob = clob column
commit;
dbms_lob.freetemporary(l_clob);
dbms_sql.close_cursor(v_cursor_id);
exception when others then
dbms_sql.close_cursor(v_cursor_id);
raise;
end;
/
我使用这个标准过程来显示任何动态查询的结果,带有标题。我从这篇文章中借用了一些代码 修改它以满足您的需求,例如
l_clob := l_clob || l_separator || l_descTbl(i).col_name ;
用于标题,以及
l_clob := l_clob || l_separator || l_columnValue;
排
嗨,我试过这个,但它对CLOB不起作用!dbms_lob.writeappend(l_clob,length(l_行),l_行)@史蒂夫:“不工作”不是一个问题陈述。描述您遇到的错误,可能会对您有所帮助。数据是通过dbms|U输出打印出来的,但当我试图使用l|U clob:=l|U分隔符| l|U columnValue将数据插入表中时,它只插入了单列值。@steve:我不确定您是如何修改的。我已经编辑了我的答案并添加了一个演示。看一看。@steve:这对按行存储没有好处。以后提取会简单得多。虽然可以完成您想要的操作,但您必须稍微调整代码,并使用
update
而不是insert
。我可以为您提供全部代码。但是,我希望你试试。我的建议是重新考虑你的设计。如果您没有其他选择,则按行存储(此解决方案)要比您期望的要好得多。
l_clob := l_clob || l_separator || l_columnValue;