本帖最后由 samt007 于 2015-8-6 12:44 编辑
如果是动态SQL(不是动态open for游标),用dbms_sql包是可以动态获取所执行的SQL的栏位名称以及栏位类型。
例子:
dbms_sql.describe_columns2( t_c, t_col_cnt, t_desc_tab );
for c in 1 .. t_col_cnt
loop
if p_column_headers
then
cell( c, 1, t_desc_tab( c ).col_name
, p_fontId => get_font('Calibri', p_bold => true)
, p_sheet => t_sheet
, p_fillId => XYG_ALD_XLSX_PKG.get_fill( 'solid', 'cccccc' ) );
end if;
-- dbms_output.put_line( t_desc_tab( c ).col_name || ' ' || t_desc_tab( c ).col_type );
case
when t_desc_tab( c ).col_type in ( 2, 100, 101 )
then
dbms_sql.define_array( t_c, c, n_tab, t_bulk_size, 1 );
when t_desc_tab( c ).col_type in ( 12, 178, 179, 180, 181 , 231 )
then
dbms_sql.define_array( t_c, c, d_tab, t_bulk_size, 1 );
when t_desc_tab( c ).col_type in ( 1, 8, 9, 96, 112 )
then
dbms_sql.define_array( t_c, c, v_tab, t_bulk_size, 1 );
else
null;
end case;
end loop;
然后用t_desc_tab( c ).col_type来判断。
例如:
t_desc_tab( c ).col_type in ( 2, 100, 101 )--这个是number类型。
t_desc_tab( c ).col_type in ( 12, 178, 179, 180, 181 , 231 )--这个是date类型。
t_desc_tab( c ).col_type in ( 1, 8, 9, 96, 112 )--这个是varchar类型。
在我之前研究的生成excel的Pkg里面有用到这个东东。
---或者下面这个是获取栏位名称的(某版主写的代码)
DBMS_SQL.PARSE( L_THECURSOR, P_QUERY, DBMS_SQL.NATIVE );
DBMS_SQL.DESCRIBE_COLUMNS( L_THECURSOR, L_COLCNT, L_DESCTBL );
FOR I IN 1 .. L_COLCNT LOOP
IF i>1 THEN
lv_sql := lv_sql||'||'''||L_SEPARATOR||'''||';
END IF;
lv_sql := lv_sql||'r(i).'||L_DESCTBL(I).COL_NAME;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(L_THECURSOR);
---------
只不过open for这种就是难搞了~
求教版主了~看是否有好办法!