Oracle游标的返回类型

cre*_*4ok 3 oracle plsql

我想声明以下游标:

CURSOR some_cursor RETURN oks_trips.trip_id % TYPE IS
    SELECT trip_id FROM oks_trips;
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误:

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

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

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

所以问题是为什么我不能使用NUMBERsome_field % TYPE在游标的RETURN子句中?

Ale*_*ole 7

从概念指南:

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

重要的一句是"以记录为导向".显式游标声明语法也清楚地显示了返回类型必须是a rowtype,它定义为:

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

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

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

在您的情况下,行类型只需要包含一个列,但仍然没有理由您应该 - 或者期望Oracle - 让您在该极限情况下采用快捷方式.提供一个单一的一致机制似乎并不合理 - 声明它并不是很困难record,而对它们进行建立,测试和维护单独的路径将是一个相当大的开销.