gpt4 book ai didi

oracle - 您如何从返回引用游标的Oracle过程中获得格式正确的结果?

转载 作者:行者123 更新时间:2023-12-03 12:51:57 25 4
gpt4 key购买 nike

在MS SQL Server中,如果我想检查存储过程的结果,则可以在Management Studio中执行以下操作。

--SQL SERVER WAY
exec sp_GetQuestions('OMG Ponies')

结果 Pane 中的输出可能看起来像这样。
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语句,因此它们始终可用于调试,尽管这会增加一些开销。

编辑

嗯,除非您愿意在包外声明自己的类型(以及该类型的表),否则不确定是否可以将返回的refsors编码为可用类型。不过,您可以这样做,只是转储结果:
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;

关于oracle - 您如何从返回引用游标的Oracle过程中获得格式正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3526798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com