如何解决在不知道记录的列名的情况下打印记录表类型的值
我创建了一个过程,该过程使用View to PRINT(转换为CSV)该视图的所有记录。 任何用户都可以删除并重新创建该视图,因此其列结构可以更改
是否有任何方法可以将VIEW的所有记录捕获到集合中 该集合的PRINT和PRINT元素,而无需了解所有列名/,而无需依赖列。
如果有任何办法,那么当我们的表中也有数百列时,就可以使用它。 这个问题已经问了我很多遍了,但是我找不到答案了,现在每次我需要将另一个表假脱机到csv文件中时,我都必须编辑我的过程
我通常用于假脱机的代码采用所有列名称:-
cursor c1 is
select *
from table1 nvr;
TYPE alldata_typ IS table of c1%rowtype;
v_dta alldata_typ;
BEGIN
v_fname := 'swe_WRF_.csv';
v_file := UTL_FILE.FOPEN('CDMP_OUT_DIR',v_fname,'W');
v_header := 'FSA_CODE,FSA_NAME,PROVINCE,MAKE,SERIES,REPORT_YEAR,VEHICLE_COUNT';
UTL_FILE.PUT_LINE(v_file,v_header);
OPEN c1;
loop
FETCH c1 BULK COLLECT
INTO v_dta LIMIT v_fetch_limit;
exit when v_dta.count=0 ;
FOR i IN 1..v_dta.count
LOOP
UTL_FILE.PUT_LINE(v_file,v_dta(i).fsa_code ||','||
v_dta(i).fsa_name ||','||
v_dta(i).province ||','||
v_dta(i).make ||','||
v_dta(i).series ||','||
v_dta(i).report_year ||','||
v_dta(i).vehicle_count
);
v_count := v_count + 1;
end loop;
;
解决方法
如果使用的是UTL_FILE,那么您正在将文件写出到数据库服务器上。如果只是CSV,那么您可以使用调度程序从数据库直接运行SQL * Plus命令 。
更多详细信息,请点击https://connor-mcdonald.com/2018/06/20/the-death-of-utl_file/
但实质上,调度程序可以运行SQL * Plus会话,该会话还支持输出上的CSV标记。对于较大的数据量,它可能比UTL_FILE快很多。
,您需要使用动态SQL生成所有列到csv。 我将您的代码重写如下。希望它对您有用。
declare
v_cmd varchar(4000);
c1 SYS_REFCURSOR;
v_tab_name varchar2(100) := upper('TABLE_NAME');
v_owner_name varchar2(100) := upper('OWNER_NAME');
type record_type is record(
line_data varchar2(4000));
TYPE alldata_typ IS table of record_type;
v_dta alldata_typ;
v_fname varchar2(20);
V_HEADER varchar2(20);
V_FETCH_LIMIT integer := 100;
V_COUNT integer;
BEGIN
v_fname := 'swe_WRF_.csv';
v_file := UTL_FILE.FOPEN('CDMP_OUT_DIR',v_fname,'W');
select listagg(COLUMN_NAME,',') within group(order by COLUMN_ID)
into v_header --create header with all column
from all_tab_columns
where table_name = v_tab_name
and OWNER = v_owner_name;
UTL_FILE.PUT_LINE(v_file,v_header);
select 'select ' || listagg(COLUMN_NAME,'||'',''||') within group(order by COLUMN_ID) || ' as line_data from ' || v_tab_name
into v_cmd --generate select statement
from all_tab_columns
where table_name = v_tab_name
and OWNER = v_owner_name;
OPEN c1 for v_cmd;
loop
FETCH c1 BULK COLLECT
INTO v_dta LIMIT v_fetch_limit;
exit when v_dta.count = 0;
FOR i IN 1 .. v_dta.count LOOP
UTL_FILE.PUT_LINE(v_file,v_dta(i).line_data
);
--dbms_output.put_line(v_dta(i).line_data);
v_count := v_count + 1;
end loop;
END LOOP;
end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。