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パッケージでカーソルを宣言し、オラクルがそこで要求するため、ステートメントを省略できません。

質問は、カーソルの句でorを使用できないのはなぜですか?NUMBERsome_field % TYPERETURN

4

2 に答える 2

8

コンセプトガイドから

プロシージャ、ファンクションまたはパッケージ内でカーソルを明示的に宣言して、Oracle Databaseデータのレコード指向の処理を容易にすることができます。PL/SQL エンジンは、カーソルを暗黙的に宣言することもできます。

そこにある重要なフレーズは「レコード指向」です。明示カーソル宣言の構文も、戻り値の型が arowtypeでなければならないことを明確に示しており、次のように定義されています。

カーソルが返す行のデータ型。

行/レコードではなく、単一の列のデータ型を返すように求めています。既存のものを使用したくない場合は%ROWTYPE、別の回答がすでに示しているように、代わりに Oracle がレコード型を宣言するメカニズムを提供します。

ドキュメントには、スカラー値を戻り値として使用できないとは書かれていないと不満を言っているようです。また、パッケージ、ビュー、またはロールを返すことができないとは言いません。行を表す型を返すという、できることを正確に示しているため、できないことをすべて網羅的に列挙する必要はありません。

あなたの場合、その行タイプには単一の列のみを含める必要がありますが、その非常に限られたシナリオでショートカットを使用できるようにする必要がある、またはOracleに期待する理由はまだありません。単一の一貫したメカニズムを提供することは不合理ではないように思われます. を宣言するのはそれほどrecord難しいことではありません.

于 2013-04-21T19:43:12.523 に答える