OUT パラメータを持つストアド プロシージャを作成できます。SYS_REFCURSOR
CREATE OR REPLACE PROCEDURE return_cursor( p_merch_id IN "Merch"."Id"%type,
p_order_ext IN "Order"."OrderExt"%type,
p_rc OUT sys_refcursor )
AS
BEGIN
OPEN p_rc
FOR SELECT "Merch"."Id", "Order"."Id", "Order"."OrderExt"
FROM "Order"
Join "Merch" ON "Order"."MerchId" = "Merch"."Id"
WHERE "Merch"."Id" = p_merch_id
AND "Order"."OrderExt" = p_order_ext;
END;
ただし、関数を返すストアド関数を用意する方がより自然です。SYS_REFCURSOR
CREATE OR REPLACE FUNCTION return_cursor( p_merch_id IN "Merch"."Id"%type,
p_order_ext IN "Order"."OrderExt"%type )
RETURN sys_refcursor
AS
l_rc sys_refcursor;
BEGIN
OPEN l_rc
FOR SELECT "Merch"."Id", "Order"."Id", "Order"."OrderExt"
FROM "Order"
Join "Merch" ON "Order"."MerchId" = "Merch"."Id"
WHERE "Merch"."Id" = p_merch_id
AND "Order"."OrderExt" = p_order_ext;
RETURN l_rc;
END;
一般的なスタイルの問題として、大文字と小文字を区別するテーブル名と列名を使用することは、非常にまれです。また、次のような Oracle の予約語に一致するテーブル名を使用Order
することは、あまりお勧めできません。すべての開発者にすべての識別子を常に二重引用符で囲み、常に適切な大文字と小文字を指定するように強制すると、デフォルトの大文字と小文字を区別しない規則を使用して予約語を使用しない場合よりも、はるかに多くの間違いが発生します。