在 SQL 开发人员 returns 结果集中调用存储过程?
Call stored procedure in SQL Developer that returns resultset?
我是 Oracle 的新手,所以请多多包涵。我一直在搜索,但我还没有找到直接的答案。
在SQL Developer
中,我创建了以下存储过程。我假设它的创建是因为它 returns 消息 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;
/
现在我想call/execute存储过程查看结果集(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
.
您只需运行工作表中的select语句即可查看结果。
如果你想要一个返回结果集的对象,我会使用一个 returns a table
的函数
我学到的简单教程:Tutorial
那么您只需 运行 工作表中的语句 select * from table(function_oracle_get_top_n_tests);
您正在获得结果,只是您没有对其进行任何操作。你可以print
它:
variable mycursor refcursor;
exec oracle_get_top_n_tests ( :mycursor );
print mycursor
输出将进入脚本输出 window,而不是网格。 (您需要将其设为函数,或 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;
如果您运行将其作为脚本,那么结果仍将进入脚本输出window;如果你 运行 它作为一个声明,那么它们将进入结果网格,但作为一个单一的 row/column,你可以展开它以查看实际内容。
如果您没有被过程所困,那么您可以将其替换为函数,这样就不需要包装器了:
-- 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;
与应用于包装的结果相同的注释。
我是 Oracle 的新手,所以请多多包涵。我一直在搜索,但我还没有找到直接的答案。
在SQL Developer
中,我创建了以下存储过程。我假设它的创建是因为它 returns 消息 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;
/
现在我想call/execute存储过程查看结果集(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
.
您只需运行工作表中的select语句即可查看结果。
如果你想要一个返回结果集的对象,我会使用一个 returns a table
的函数我学到的简单教程:Tutorial
那么您只需 运行 工作表中的语句 select * from table(function_oracle_get_top_n_tests);
您正在获得结果,只是您没有对其进行任何操作。你可以print
它:
variable mycursor refcursor;
exec oracle_get_top_n_tests ( :mycursor );
print mycursor
输出将进入脚本输出 window,而不是网格。 (您需要将其设为函数,或 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;
如果您运行将其作为脚本,那么结果仍将进入脚本输出window;如果你 运行 它作为一个声明,那么它们将进入结果网格,但作为一个单一的 row/column,你可以展开它以查看实际内容。
如果您没有被过程所困,那么您可以将其替换为函数,这样就不需要包装器了:
-- 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;
与应用于包装的结果相同的注释。