我在带有原型的包中有一个过程:
PROCEDURE simpleSearch(p_keyword IN VARCHAR2,
p_events OUT SYS_REFCURSOR);
在包体中,我的定义是:
PROCEDURE simplesearch(p_keyword IN VARCHAR2,
p_events OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_events FOR
SELECT *
FROM event e, show s
WHERE s.eventid = e.id;
END simplesearch;
当我运行它时,我进入调试屏幕:
DECLARE
p_keyword VARCHAR2(200);
p_events REF cursor;
BEGIN
p_keyword := 'r';
package1.SIMPLESEARCH(
P_KEYWORD => p_keyword,
P_EVENTS => p_events
);
-- DBMS_OUTPUT.PUT_LINE('P_EVENTS = ' || P_EVENTS);
:P_EVENTS := p_events; -- <-- Cursor
--rollback;
END;
它给出了错误PLS-00201: identifier 'CURSOR' must be declared
为什么游标类型更改为REF CURSOR
即使我将其声明为 SYS_REFCURSOR
?
为什么要使用 REFCURSOR 来存储SYS_REFCURSOR的输出。将您的调用块更改为下面,它应该可以工作:
DECLARE
P_KEYWORD VARCHAR2(200);
P_EVENTS SYS_REFCURSOR ;
BEGIN
P_KEYWORD := 'r';
PACKAGE1.SIMPLESEARCH(
P_KEYWORD => P_KEYWORD,
P_EVENTS => P_EVENTS
);
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('P_EVENTS = ' || P_EVENTS);
*/
-- :P_EVENTS := P_EVENTS; --<-- Cursor
--rollback;
END;
一定是这个
DECLARE
P_KEYWORD VARCHAR2(200);
P_EVENTS SYS_REFCURSOR;
BEGIN
或长格式(我认为您必须使用它是在 Oracle 10g 之前):
DECLARE
P_KEYWORD VARCHAR2(200);
TYPE P_EVENTS_TYPE IS REF CURSOR;
P_EVENTS P_EVENTS_TYPE;
BEGIN