如何从返回参考光标的Oracle过程获得格式良好的结果?
发布时间:2020-12-12 13:48:00 所属栏目:百科 来源:网络整理
导读:在MS SQL Server中,如果我想检查存储过程的结果,我可能会在Management Studio中执行以下操作. --SQL SERVER WAYexec sp_GetQuestions('OMG Ponies') 结果窗格中的输出可能如下所示. ID Title ViewCount Votes ----- ---------------------------------------
在MS SQL Server中,如果我想检查存储过程的结果,我可能会在Management Studio中执行以下操作.
--SQL SERVER WAY exec sp_GetQuestions('OMG Ponies') 结果窗格中的输出可能如下所示. ID Title ViewCount Votes ----- ------------------------------------------------- ---------- -------- 2165 Indexed View vs Indexes on Table 491 2 5068 SQL Server equivalent to Oracle’s NULLS FIRST 524 3 1261 Benefits Of Using SQL Ordinal Position Notation? 377 2 (3 row(s) affected) 无需编写循环或PRINT语句. 要在Oracle中执行同样的操作,我可能会在SQL Developer中执行以下匿名块 --ORACLE WAY DECLARE OUTPUT MYPACKAGE.refcur_question; R_OUTPUT MYPACKAGE.r_question; USER VARCHAR2(20); BEGIN dbms_output.enable(10000000); USER:= 'OMG Ponies'; recordCount := 0; MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT,p_USER=> USER,) ; DBMS_OUTPUT.PUT_LINE('ID | Title | ViewCount | Votes' ); LOOP FETCH OUTPUT INTO R_OUTPUT; DBMS_OUTPUT.PUT_LINE(R_OUTPUT.QUESTIONID || '|' || R_OUTPUT.TITLE '|' || R_OUTPUT.VIEWCOUNT '|' || R_OUTPUT.VOTES); recordCount := recordCount+1; EXIT WHEN OUTPUT % NOTFOUND; END LOOP; DBMS_OUTPUT.PUT_LINE('Record Count:'||recordCount); CLOSE OUTPUT; END; 这样输出 ID|Title|ViewCount|Votes 2165|Indexed View vs Indexes on Table|491|2 5068|SQL Server equivalent to Oracle’s NULLS FIRST|524|3 1261|Benefits Of Using SQL Ordinal Position Notation?|377|2 Record Count: 3 所以SQL版本有1行,而oracle有18行,输出是丑的.如果有很多列和/或数据是数字的,它会加剧. 对我来说这是奇怪的是,如果我在SQL Developer或Management studio中写这个语句 SELECT ID,Title,ViewCount,Votes FROM votes where user = 'OMG Ponies' 结果相当相似.这让我觉得我是缺少技术或使用错误的工具. 如果GetQuestions是一个返回refcursor的函数,这似乎是您在SQL Server版本中的,那么您可能会这样做:select * from table(MyPackage.GetQuestions('OMG Ponies')); 或者如果您需要在PL / SQL块中,那么您可以在游标中使用相同的选择. 您也可以使该函数产生dbms_output语句,因为它们始终可用于调试,尽管这增加了一些开销. 编辑 嗯,不知道是否可以将返回的refcursor转换成可用的类型,除非你愿意在包之外声明自己的类型(和类型的表).你可以这样做,只是为了转储结果: create package mypackage as function getquestions(user in varchar2) return sys_refcursor; end mypackage; / create package body mypackage as function getquestions(user in varchar2) return sys_refcursor as r sys_refcursor; begin open r for /* Whatever your real query is */ select 'Row 1' col1,'Value 1' col2 from dual union select 'Row 2','Value 2' from dual union select 'Row 3','Value 3' from dual; return r; end; end mypackage; / var r refcursor; exec :r := mypackage.getquestions('OMG Ponies'); print r; 您可以使用另一个过程或函数中的调用结果;它只是在PL / SQL外面看起来有点棘手. 编辑添加:使用这种方法,如果它是一个程序,你可以做同样的事情: var r refcursor; exec mypackage.getquestions(:r,'OMG Ponies'); print r; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Hybrid技术,助力大学生就业创业
- SQLite3使用方法大全(二)之数据类型
- JBuilder9 Weblogic8 + PostgreSQL7 How to
- Stutio 插件 jimu Mirror实时预览xml
- objective-c – 添加UITapGestureRecognizer后UIButtons不起
- XML DOM - XMLHttpRequest 对象
- iphone – Xcode:为不同的构建配置设置GCC_PREPROCESSOR_D
- 正则表达式 – Vim正面看后面的bug?
- ruby 16种 hello world 写法
- ruby-on-rails – RubyOnRails用于设计的单点登录策略