


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
plsql中怎样获取未知结构的动态游标的字段名对于使用过 oracle plsql 中的动态游标的人来说,我相信有不少人都会有这样的想法:如果对于任意一个给定的未知结构的游标(ref cursor),我们都能够在plsql中获取它的所有字段的名称,那该多好啊!不知道你是否有这样的想法,反正我早就有这样的想法了,也百度了多次,但结果不尽人意。曾经一度以为,这是不可能的。但是plsql developer中的test 窗口中,可以打开任意游标并得到字段名及值。很显然,还是有办法得到未知结构的动态游标的字段名的,只是我不知道方法而已。今天早上心血来潮,又想到这个事情,于是google了一下(用英文查询:how to get column names from oracle cursor),发现还真有办法获取未知结构的动态游标!看来在这方面百度还是太弱啊!技术问题还是得问google 。整理之后,结论如下:1、如果给的是一个查询sql文本,那么事情很容易(对于9i及以上版本),只要使用dbms_sql.open_cursor打开游标,再使用dbms_sql.describe_columns 即可得到游标的所有字段名称及类型等数据,存储在一个集合类型变量中(具体请看dbms_sql.desc_tab)。请参考如下plsql代码:declare l_curid integer; l_cnt number; l_desctab dbms_sql.desc_tab; l_sqltext varchar2(2000);begin l_sqltext := select owner,object_type,object_name from dba_objects where rownum = 10; -可以是任意有效的查询sql文本 l_curid := dbms_sql.open_cursor(); dbms_sql.parse(l_curid, l_sqltext, dbms_sql.native); dbms_sql.describe_columns(l_curid, l_cnt, l_desctab); for i in 1 . l_desctab.count loop dbms_output.put(lpad(l_desctab(i).col_name, 20); end loop; dbms_output.new_line; dbms_sql.close_cursor(l_curid);end;运行结果如下:owner object_type object_name 注意,必须使用 dbms_sql.open_cursor 打开游标,否则,就不是这种处理方法了。2、如果给的是一个ref cursor类型变量,而不知道sql文本,该怎么办呢?这里分两种情况:1) 如果数据库版本是11g及以上,同样很容易:使用dbms_sql.to_cursor_number(cursor)得到游标的id,再使用dbms_sql.describe_columns即可得到游标字段名称。参考如下代码:declare type ref_cursor is ref cursor; l_cursor ref_cursor; l_curid number; l_col_cnt number; l_desc_tab dbms_sql.desc_tab;begin open l_cursor for select owner,object_type,object_name from dba_objects where rownum = 10; l_curid := dbms_sql.to_cursor_number(l_cursor); dbms_sql.describe_columns(l_curid, l_col_cnt, l_desc_tab); for i_ in 1 . l_col_cnt loop dbms_output.put_line(l_desc_tab(i).col_name); end loop; dbms_sql.close_cursor(l_cursor);end;2) 如果数据库版本低于11g,则plsql中仅有如下方法可以获取字段名称及字段值:declare l_cursor sys_refcursor; i number := 0; cursor get_columns is select t2.column_value.getrootelement() name, extractvalue(t2.column_value, node() value from (select * from table(xmlsequence(l_cursor) t1, table(xmlsequence(extract(t1.column_value, /row/node() t2;begin open l_cursor for select owner,object_type,object_name from dba_objects where rownum = 10; for rec_ in get_columns loop i := i + 1; dbms_output.put_line(i | : | rec_.name | : | rec_.value); end loop; close l_cursor;end;用这种方法,可以得到动态游标的所有数据,包括字段名称和字段值。但这种方法会遍历游标,即游标已经走到底了,不能再次使用了。而使用dbms_sql.describe_columns不会对游标的光标位置产生任何影响。两者优劣一目
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版企业税收筹划与财务优化咨询合同
- 2025年度大学生创新创业实习基地合作协议
- 2025版石子买卖合同标准文本
- 2025版挖掘机运输与现场安装指导合同
- 2025版智能热水器远程监控与紧急维修合同
- 河北省安平县2025年上半年事业单位公开遴选试题含答案分析
- 2025版砂石厂爆破施工安全培训与考核合同
- 2025创业项目网络直播带货渠道合作协议
- 2025年度道路照明施工总价合同模板
- 2025年智能物流仓储系统供货与运营管理协议
- 幼儿园课程概论第2版(学前教育专业)PPT全套完整教学课件
- 系统性红斑狼疮狼疮性肾炎
- 护理科研选题与论文写作
- YY/T 0086-2020医用冷藏箱
- LY/T 2246-2014森林消防专业队伍建设和管理规范
- JJG 956-2013大气采样器
- GA/T 1707-2020防爆安全门
- 会展项目管理教材 课件
- 重医大内科诊疗操作规范内科诊疗操作规范
- 初中英语单元整体教学讲座课件
- 《幸福比优秀更重要》读书分享 课件
评论
0/150
提交评论