PLSQL中怎样获取未知结构的动态游标(REFCURSOR)的字段名_第1页
PLSQL中怎样获取未知结构的动态游标(REFCURSOR)的字段名_第2页
PLSQL中怎样获取未知结构的动态游标(REFCURSOR)的字段名_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PLSQL中怎样获取未知结构的动态游标的字段名对于使用过ORACLEPLSQL中的动态游标的人来说,我相信有不少人都会有这样的想法如果对于任意一个给定的未知结构的游标(REFCURSOR),我们都能够在PLSQL中获取它的所有字段的名称,那该多好啊!不知道你是否有这样的想法,反正我早就有这样的想法了,也百度了多次,但结果不尽人意。曾经一度以为,这是不可能的。但是PLSQLDeveloper中的test窗口中,可以打开任意游标并得到字段名及值。很显然,还是有办法得到未知结构的动态游标的字段名的,只是我不知道方法而已。今天早上心血来潮,又想到这个事情,于是google了一下(用英文查询:howto

2、getcolumnnamesfromoraclecursor),发现还真有办法获取未知结构的动态游标!看来在这方面百度还是太弱啊!技术问题还是得问google。整理之后,结论如下:1、如果给的是一个查询SQL文本,那么事情很容易(对于9i及以上版本),只要使用dbms_sql.open_cursor打开游标,再使用dbms_sql.describe_columns即可得到游标的所有字段名称及类型等数据,存储在一个集合类型变量中(具体请看dbms_sql.desc_tab)。请参考如下PLSQL代码:DECLAREl_curidINTEGER;l_cntNUMBER;l_desctabdbms_

3、sql.desc_tab;l_sqltextVARCHAR2(2000);BEGINl_sqltext:=selectowner,object_type,object_namefromdba_objectswhererownum=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);FORiIN1.l_desctab.countLOOPdbms_o

4、utput.put(lpad(l_desctab(i).col_name,20);ENDLOOP;dbms_output.new_line;dbms_sql.close_cursor(l_curId);END;运行结果如下:OWNEROBJECT_TYPEOBJECT_NAME注意,必须使用DBMS_SQL.OPEN_CURSOR打开游标,否则,就不是这种处理方法了。2、如果给的是一个REFCURSOR类型变量,而不知道SQL文本,该怎么办呢?这里分两种情况:如果数据库版本是11g及以上,同样很容易:使用dbms_sql.to_cursor_number(cursor)得到游标的ID,再使用d

5、bms_sql.describe_columns即可得到游标字段名称。参考如下代码:DECLARETYPEref_cursorISREFCURSOR;l_cursorref_cursor;l_curidNUMBER;l_col_cntNUMBER;l_desc_tabDBMS_SQL.DESC_TAB;BEGINOPENl_cursorFORselectowner,object_type,object_namefromdba_objectswhererownum=10;l_curid:=DBMS_SQL.to_cursor_number(l_cursor);DBMS_SQL.DESCRIBE_

6、COLUMNS(l_curid,l_col_cnt,l_desc_tab);FORi_IN1.l_col_cntLOOPDBMS_OUTPUT.PUT_LINE(l_desc_tab(i).col_name);ENDLOOP;DBMS_SQL.CLOSE_CURSOR(l_cursor);END;如果数据库版本低于11g,则PLSQL中仅有如下方法可以获取字段名称及字段值:DECLAREl_cursorSYS_REFCURSOR;iNUMBER:=0;CURSORget_columnsISSELECTt2.column_value.getrootelement()NAME,EXTRACTVAL

7、UE(t2.column_value,node()VALUEFROM(SELECT*FROMTABLE(XMLSEQUENCE(l_cursor)t1,TABLE(XMLSEQUENCE(EXTRACT(t1.column_value,/ROW/node()t2;BEGINOPENl_cursorFORselectowner,object_type,object_namefromdba_objectswhererownum=10;FORrec_INget_columnsLOOPi:=i+1;DBMS_OUTPUT.put_line(i|:|rec_.name|:|rec_.VALUE);ENDLOOP;CLOSEl_cursor;END;用这种方法,可以得到动态游标的所有数据,包括字段名称和字段值。但这种方法会遍历游标,即游标已经走到底了,不能再次使用了。而使用dbms_sql.describe_columns不会对游标的光标位置产生任何影响。两者优劣一目了然。对于JAV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论