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 中的游标的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL中的游标

过程(PL/SQL 包)中的“ORA-01001 无效游标”

PL SQL 中的游标

可选参数作为游标中的条件 (PL/SQL)

oracle PL/SQL 中的游标

PL/SQL - 你可以通过索引访问游标中的某些记录吗?