我在Oracle Sql Developer中测试这个简单的存储过程时遇到了麻烦。存储过程执行简单的选择并返回游标。
create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY
( projectId IN NUMBER,
resultset_out OUT sys_refcursor
) AS
BEGIN
OPEN resultset_out for
SELECT * from GLIDE_HISTORY
where GLIDE_HISTORY.PRJ_ID = projectId;
/* DBMS_OUTPUT.PUT_LINE(resultset_out);*/
END GET_PROJECT_DRF_HISTORY;
为了测试此过程,我使用了以下脚本:
variable results sys_refcursor;
exec get_project_drf_history(3345, :results);
print :results;
对于oracle和Sql Developer工具都是新手,我很难理解这里的错误是什么。我无法在Sql * Plus中检查这个,因为我没有密码这样做。我正在使用Oracle Sql Developer 1.1.2.25和Oracle 10g。
有人可以帮帮我吗?提前谢谢。
答案 0 :(得分:1)
塞米,
变量声明应该是 refcursor 而不是sys_refcursor。 此外,当您打印结果时,您正在打印变量本身,因此不需要:(用于表示是绑定变量)。
我能够在SQL Developer中成功运行以下脚本(当然还有sql plus。) 对于SQL Developer,使用F5将其作为脚本运行。
--Creating Procedure
create or replace procedure test_ref(
i_limit number,
o_results out sys_refcursor
) is
begin
open o_results for
'select object_name
from all_objects
where rownum < ' || i_limit;
end;
/
然后是调用此过程的脚本。 (使用F5作为脚本执行)。
var c1 refcursor;
exec test_ref(10,:c1);
print c1;
答案 1 :(得分:0)
这是一个工作示例,声明refcursor然后通过在匿名块中调用proc来分配值。 然后你打印它
var x REFCURSOR ;
declare
/*a no cleanup procedure*/
procedure GetMeMyRefCursor(outter out nocopy sys_refcursor)
as
begin
open outter for
select level
from dual
connect by level <= 5;
end GetMeMyRefCursor;
begin
GetMeMyRefCursor(:x);
/*note you pass in the refcursor you created via the :X*/
end ;
/
print x;
/*now print it*/
/*LEVEL
----------------------
1
2
3
4
5*/
基于评论: 现在使用你的评论,你有IN / OUT参数的问题,而不是打印(没有读标题只是问题和其他响应)
这有效:(基于你的代码)
create or replace
PROCEDURE GET_PROJECT_DRF_HISTORY
( projectId IN NUMBER,
resultset_out OUT sys_refcursor
) AS
BEGIN
OPEN resultset_out for
SELECT level from dual connect by level <= projectId;
/* DBMS_OUTPUT.PUT_LINE(resultset_out);*/
END GET_PROJECT_DRF_HISTORY;
/
var results REFCURSOR;
--this needs to be REFCURSOR (at least in 10g and 11i)
exec GET_PROJECT_DRF_HISTORY(5, :results);
print results;
/
您还可以直接从SQL Developer调试包和过程(这可以是一个真正的救星) 如果你想在SQL Developer中调试它真的很容易:
在连接 - &gt;您的架构在这里 - &gt;程序 - &gt;右键单击GET_PROJECT_DRF_HISTORY并“编译以进行调试”。然后在程序中放置一个断点,然后右键单击并“调试”它(这将创建一个匿名块 - 见下文 - 您可以在其中放入您的值等)
DECLARE
PROJECTID NUMBER;
RESULTSET_OUT sys_refcursor;
BEGIN
PROJECTID := NULL;
GET_PROJECT_DRF_HISTORY(
PROJECTID => PROJECTID,
RESULTSET_OUT => RESULTSET_OUT
);
-- Modify the code to output the variable
-- DBMS_OUTPUT.PUT_LINE('RESULTSET_OUT = ' || RESULTSET_OUT);
END;
否则,如果您从Developer中执行此操作,则错误看起来不应该出现。
但我真正想到的是你的VAR是不正确的,因此它不存在!
variable results sys_refcursor;
Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) |
VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) |
NVARCHAR2 (n) | CLOB | NCLOB | REFCURSOR |
BINARY_FLOAT | BINARY_DOUBLE ] ]
所以,从我最初的例子“var x REFCURSOR;”开始应该工作
答案 2 :(得分:0)
我建议您让管理员升级您的SQL Developer版本。你的版本已经过时了,你可能会遇到一些模糊不清的错误。 (当我尝试使用版本1时我做了)你现在应该在2.1上。