Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle中如何将动态查询数据导入CLOB列_Oracle_Plsql - Fatal编程技术网

Oracle中如何将动态查询数据导入CLOB列

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);

我想将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);
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;