PL SQL 中的游标
Posted
技术标签:
【中文标题】PL SQL 中的游标【英文标题】:Cursor in PL SQL 【发布时间】:2015-01-27 19:06:14 【问题描述】:我需要调用一个函数,这个函数返回一个游标。 ¿如何将光标作为参数发送?我正在尝试以下方法,但它不起作用。 谢谢。
DECLARE
P_NUMBER NUMBER;
P_TABCURSOR REF CURSOR;
BEGIN
P_NUMBER := '80233068';
P_TABCURSOR := NULL;
P_TABCURSOR:= PKG_CHANNEL.OBTAIN_CHANNEL ( P_NUMBER => P_NUMBER,
P_TABCURSOR => P_TABCURSOR) ;
END;
我收到此错误:PLS-00201:必须声明标识符“CURSOR”
【问题讨论】:
定义“不工作”。你有错误吗?什么错误? 是的,抱歉,我收到此错误:PLS-00201:必须声明标识符“CURSOR”REF CURSOR
不是 PL/SQL 中的有效类型。 pkg_channel.obtain_channel
的定义是什么?我的猜测是它返回一个SYS_REFCURSOR
,在这种情况下,您希望将p_tabcursor
定义为SYS_REFCURSOR
类型。然而,该函数可能被定义为返回一个强类型引用游标,在这种情况下,您希望局部变量也属于该类型。
感谢您的回答。定义是:PROCEDURE obtain_channel ( P_NUMBER IN NUMBER, p_tabcursor OUT typeCursor)
,我尝试声明为:type cursor,但我得到了同样的错误。
【参考方案1】:
一定是这个:
TYPE P_TABCURSOR_TYPE IS REF CURSOR;
P_TABCURSOR P_TABCURSOR_TYPE;
或
P_TABCURSOR SYS_REFCURSOR;
完全一样,只是更短。
【讨论】:
【参考方案2】:首先,我认为您的语法不正确。 我想你想要 sys_refcursor。可能有一个对象 ref_cursor,但 ref cursor 是 pl/sql 的 2 个变量
https://community.oracle.com/thread/888365
【讨论】:
【参考方案3】:如果pkg_channel.obtain_channel
的参数定义为typeCursor
,那么规范中必须定义一个类型:pkg_channel.typecursor
。这就是您需要用作保存该参数的变量的数据类型。
此外,您正在调用一个过程,因此您不会尝试显式设置变量值(即使用:=
)。并且不要将变量声明为数字,然后尝试将字符串传入!相反,你会这样做:
declare
p_number number;
p_tabcursor pkg_channel.typecursor;
begin
p_number := 80233068;
pkg_channel.obtain_channel (p_number => p_number,
p_tabcursor => p_tabcursor);
end;
/
【讨论】:
【参考方案4】:你应该先做一个cursur。 然后是一个记录,您将 curson 的每个值都放入其中。
在此处查看有关 CURSORS 和 RECORDS 的信息。 Click here for link
例子:
首先你需要创建一个游标。
CURSOR cursorName is
SELECT id, name
FROM Employee;
然后你从那个游标中取出记录到一个记录中。
OPEN cursorName;
LOOP
FETCH cursorName INTO recordName
EXIT WHEN cursorName%notfound;
END LOOP
【讨论】:
以上是关于PL SQL 中的游标的主要内容,如果未能解决你的问题,请参考以下文章