我是Oracle的新手,所以请多多包涵。我一直在搜索,但是还没有找到直接的答案。
在SQL Developer
中,我创建了以下存储过程。我认为它是创建的,因为它返回了消息Procedure ORACLE_GET_TOP_N_TESTS compiled
:
create procedure oracle_get_top_n_tests
(oracle_tests OUT SYS_REFCURSOR)
AS
BEGIN
OPEN oracle_tests FOR
select * from sales.quiz_results;
END oracle_get_top_n_tests;
/
现在,我想调用/执行存储过程以查看结果集(select
语句)。我尝试了以下操作,但没有看到结果集:
variable mycursor refcursor;
exec oracle_get_top_n_tests ( :mycursor );
/* Received message PL/SQL procedure successfully completed, but no result */
我在做什么错了?
我使用Database 11g Express Edition
。
答案 0 :(得分:3)
您正在得到结果,您只是没有做任何事情。您可以print
:
variable mycursor refcursor;
exec oracle_get_top_n_tests ( :mycursor );
print mycursor
输出将进入脚本输出窗口,而不是网格。 (您需要将其设为一个函数或use a wrapper function,以将输出显示在网格中,即使那样,还有一个额外的步骤来查看它们。)
简单的包装函数:
create function oracle_get_top_n_tests_wrapper
RETURN SYS_REFCURSOR
AS
oracle_tests SYS_REFCURSOR;
BEGIN
oracle_get_top_n_tests (oracle_tests => oracle_tests);
return oracle_tests;
END oracle_get_top_n_tests_wrapper;
/
然后将其称为:
select oracle_get_top_n_tests_wrapper from dual;
如果将其作为脚本运行,则结果仍将显示在脚本输出窗口中;如果您将其作为语句运行,则它们将进入结果网格,但会以单个行/列的形式出现,您可以对其进行扩展以查看实际内容。
如果您不喜欢某个过程,则可以将其替换为一个函数,这样就不需要包装器了。
-- drop function oracle_get_top_n_tests_wrapper
-- drop procedure oracle_get_top_n_tests
create function oracle_get_top_n_tests
RETURN SYS_REFCURSOR
AS
oracle_tests SYS_REFCURSOR;
BEGIN
OPEN oracle_tests FOR
select * from sales.quiz_results;
return oracle_tests;
END oracle_get_top_n_tests;
/
,然后直接致电:
select oracle_get_top_n_tests from dual;
对应用于包装程序的结果具有相同的注释。
答案 1 :(得分:0)
您只需在工作表中运行select语句即可查看结果。
如果您想要一个对象返回结果集,我将使用一个返回表的函数
一个简单的教程,我从中学到了:Tutorial
然后您只需运行工作表select * from table(function_oracle_get_top_n_tests);