oracle动态菜单,本地动态SQL(Open for等)如何获取SQL的定义属性,包括栏位名称和数据类型...

本帖最后由 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这种就是难搞了~

求教版主了~看是否有好办法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值