4

我想声明以下游标:

CURSOR some_cursor RETURN oks_trips.trip_id % TYPE IS
    SELECT trip_id FROM oks_trips;

但我得到一个错误:

Error(5,36): PLS-00320: the declaration of the type of this expression is incomplete or malformed

oks_trips.trip_id 类型是NUMBER(3, 0),所以我只尝试了 NUMBER 而不是,oks_tripd.trip_id % TYPE但我仍然得到错误。

我不能省略该RETURN语句,因为我在包中声明游标,而 oracle 要求它在那里。

所以问题是为什么我不能在游标的子句中使用NUMBER或?some_field % TYPERETURN

4

2 回答 2

8

从概念指南

您可以在过程、函数或包中显式声明游标,以促进 Oracle 数据库数据的面向记录的处理。PL/SQL 引擎也可以隐式声明游标。

重要的短语是“面向记录”。显式游标声明的语法也清楚地表明返回类型必须是 a rowtype,它定义为:

游标返回的行的数据类型。

您要求它返回单列的数据类型,而不是行/记录的数据类型。如果您不想使用现有的,%ROWTYPE那么 Oracle 提供了声明记录类型的机制,正如另一个答案已经显示的那样。

您似乎在抱怨文档没有说您不能使用标量值作为返回值。它也没有说你不能返回一个包、一个视图或一个角色。它不需要详尽地列出您不能做的所有事情,因为它清楚地告诉您确切可以做什么,即返回一个表示行的类型。

在您的情况下,行类型只需要包含一列,但是仍然没有理由您应该能够(或期望 Oracle)让您在这种非常有限的情况下走捷径。提供单一一致的机制似乎并非不合理 - 声明 . 对您来说并不是什么困难record,而他们为此构建、测试和维护单独的路径将是相当大的开销。

于 2013-04-21T19:43:12.523 回答
1
CREATE OR REPLACE PACKAGE mypackage AS
   TYPE rec IS RECORD (trip_id oks_trips.trip_id % TYPE);
   CURSOR some_cursor RETURN rec;
END;
/

CREATE OR REPLACE PACKAGE BODY mypackage AS
   CURSOR some_cursor RETURN rec IS
   SELECT trip_id FROM oks_trips;
END;
/
于 2013-04-21T15:24:13.413 回答