2013-04-21 64 views
3

我想声明以下光标:Oracle游标的返回类型

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需要它。

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

回答

7

From the concepts guide

You can declare a cursor explicitly within a procedure, function, or package to facilitate record-oriented processing of Oracle Database data. The PL/SQL engine can also declare cursors implicitly.

重要的短语有 '面向记录的'。该syntax for explicit cursor declaration也清楚地表明返回类型必须是一个rowtype,它的定义:

The data type of the row that the cursor returns.

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

你似乎在抱怨文档没有说你不能使用标量值作为回报。它也没有说你不能返回一个包,一个视图或一个角色。它并不需要详尽地列出所有你不能做,因为它明确地告诉你,正是你可以做的,这是返回一个代表行的一个。

在你的情况该行只需要键入包含单个列,但仍没有任何理由,你应该能够 - 或者期待甲骨文 - 让你走了一条捷径在非常limitd场景。它似乎没有不合理提供一个一致的机制 - 这不是太大的困难为你申报record,而bulding的他们,测试和维护一个单独的路径,这将是一个相当大的开销。

+0

非常感谢充分和明确的答案:) 答案在文档确实提到过,我不知道我怎么会忽略它。 – crew4ok 2013-04-21 20:07:41

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; 
/
+0

如何在它周围使用记录? – 2013-04-21 16:07:07

+0

是的,我知道这个解决方案,我的问题是_WHY_我不能在'RETURN'子句中使用非记录类型。 – crew4ok 2013-04-21 16:11:41

+1

当查询只返回一列时,Oracle可能懒得为这种特殊情况实现一个单独的语法。 :) – 2013-04-21 16:18:58