在MS SQL Server中,如果我想检查存储过程的结果,我可能会在Management Studio中执行以下操作.
--SQL SERVER WAY
exec sp_GetQuestions('OMG Ponies')
Run Code Online (Sandbox Code Playgroud)
结果窗格中的输出可能如下所示.
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)
Run Code Online (Sandbox Code Playgroud)
无需编写循环或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 | …Run Code Online (Sandbox Code Playgroud) 我有一个oracle包,其中包含一个带有输入引用游标的过程.我的理解是,这是非常标准的.
我不喜欢的是我必须编写大量代码才能看到输出.所以我问了这个问题,事实证明我可以通过创建一个包装程序的函数来得到我想要的东西.
更新:看起来我不再需要这个功能但是对于那些好奇的人来说可能值得知道,看看原来的问题和答案更新.
这是功能
FUNCTION GetQuestionsForPrint (user in varchar2)
RETURN MYPACKAGE.refcur_question
AS
OUTPUT MYPACKAGE.refcur_question;
BEGIN
MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT,
p_USER=> USER ) ;
RETURN OUTPUT;
END;
Run Code Online (Sandbox Code Playgroud)
这就是我在SQL Developer中执行它的方法
var r refcursor;
exec :r := mypackage.getquestionsForPrint('OMG Ponies');
print r;
Run Code Online (Sandbox Code Playgroud)
所以从现在开始,我可能会将ForPrint函数添加到我的所有程序中.
这让我思考,也许功能是我想要的,我不需要程序.
为了测试这个我尝试从.NET执行该函数,除了我不能这样做.这真的是这样吗?
using (OracleConnection cnn = new OracleConnection("Data Source=Test;User Id=Test;Password=Test;"))
{
cnn.Open();
OracleCommand cmd = new OracleCommand("mypackage.getquestionsForPrint");
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add ( "p_USER", "OMG Ponies");
cmd.Connection = cnn;
OracleDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
Console.WriteLine(rdr.GetOracleValue(0));
}
Console.ReadLine();
} …Run Code Online (Sandbox Code Playgroud)