plsql中怎样获取未知结构的动态游标(ref cursor)的字段名

plsql中怎样获取未知结构的动态游标(ref cursor)的字段名

ID:12941515

大小:23.13 KB

页数:3页

时间:2018-07-19

plsql中怎样获取未知结构的动态游标(ref cursor)的字段名_第1页
plsql中怎样获取未知结构的动态游标(ref cursor)的字段名_第2页
plsql中怎样获取未知结构的动态游标(ref cursor)的字段名_第3页
资源描述:

《plsql中怎样获取未知结构的动态游标(ref cursor)的字段名》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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

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

3、ER;l_desctabdbms_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);FORi

4、IN1..l_desctab.countLOOPdbms_output.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文本,该怎么办呢?这里分两种情况:1)如果数据库版本是11g及以上,同样很容易:使用dbms

5、_sql.to_cursor_number(cursor)得到游标的ID,再使用dbms_sql.describe_columns即可得到游标字段名称。参考如下代码:DECLARETYPEref_cursorISREFCURSOR;l_cursorref_cursor;l_curidNUMBER;l_col_cntNUMBER;l_desc_tabDBMS_SQL.DESC_TAB;BEGINOPENl_cursorFOR'selectowner,object_type,object_namefromdba_objectswhererownum<=10';l_curid:=DB

6、MS_SQL.to_cursor_number(l_cursor);DBMS_SQL.DESCRIBE_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;2)如果数据库版本低于11g,则PLSQL中仅有如下方法可以获取字段名称及字段值:DECLAREl_cursorSYS_REFCURSOR;iNUMBER:=0;CURSORget

7、_columnsISSELECTt2.column_value.getrootelement()NAME,EXTRACTVALUE(t2.column_value,'node()')VALUEFROM(SELECT*FROMTABLE(XMLSEQUENCE(l_cursor)))t1,TABLE(XMLSEQUENCE(EXTRACT(t1.column_value,'/ROW/node()')))t2;BEGINOPENl_cursorFOR'selectowner,object_typ

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。