我对此程序有疑问。我想要做的是传入一个变量ID,然后设置一个veraible out并返回一个查询/光标。我昨天得到了一些帮助,但有些事情是不对的,也无法编译。有人可以帮我解决这个问题吗?这是我到目前为止所拥有的。
PROCEDURE SEEKER (pMonkeyID IN VARCHAR2, vMarkCounter OUT Number, seeker_cur OUT TYPES.ref_cursor)
AS
BEGIN
CURSOR seeker_cur IS
Select monkey_doc_approved, monkey_doc_vaulted
from monkeyApps
where MonkeyID = pMonkeyID
and monkey_doc_type = 'Banana'
order by monkey_doc_approved_timestamp,monkey_doc_type,monkey_doc_approved desc
vMarkCounter number:=0;
BEGIN
FOR i IN seeker_cur
LOOP
vMarkCounter := vMarkCounter+1;
END LOOP;
END;
END SEEKER;
我不确定我是否将光标设置为正确返回,我不确定我是否正确循环以设置我的monkeyMarker。光标需要返回以及标记,因为我处理两个前端逻辑。
谢谢, 弗兰克
答案 0 :(得分:1)
我认为获取记录和数量都是错误的。 但如果这就是你想要的,你就可以这样做:
PROCEDURE SEEKER (pMonkeyID IN VARCHAR2, vMarkCounter OUT Number, seeker_cur OUT TYPES.ref_cursor)
AS
BEGIN
OPEN seeker_cur for Select monkey_doc_approved, monkey_doc_vaulted
from monkeyApps where MonkeyID = pMonkeyID and monkey_doc_type = 'Banana' order by monkey_doc_approved_timestamp,monkey_doc_type,monkey_doc_approved desc;
Select count(*) INTO vMarkCounter from (Select monkey_doc_approved, monkey_doc_vaulted
from monkeyApps where MonkeyID = pMonkeyID and monkey_doc_type = 'Banana');
END SEEKER;
但是,请再次检查是否确实需要在获取行之前计算行数...
答案 1 :(得分:0)
我同意AB Cade我不明白为什么你需要记录和计数。但是,在PL \ SQL中,通过游标循环应该很少甚至不需要;您可以使用bulk collect
来代替您想要的内容。
如果您没有那么多记录,比如少于50k,我会删除批量收集的limit 10000
部分;你可以使用t_seeker.count
,它会给你答案。
PROCEDURE SEEKER ( pMonkeyID IN VARCHAR2
, vMarkCounter OUT Number
, c_seeker OUT TYPES.ref_cursor) IS
cursor c_seeker is
select monkey_doc_approved, monkey_doc_vaulted
from monkeyApps
where MonkeyID = pMonkeyID
and monkey_doc_type = 'Banana'
order by monkey_doc_approved_timestamp
, monkey_doc_type
, monkey_doc_approved desc
;
type t__seeker is table of c_seeker%rowtype index by binary_integer;
t_seeker t__seeker;
vMarkCounter number := 0;
begin
open c_seeker;
loop
fetch c_seeker bulk collect into t_seeker limit 10000;
vMarkCounter := vMarkCounter + t_seeker.count;
end loop;
-- OP want's to return a ref_cursor.
--close c_seeker;
end seeker;
/