你可以寫一個存儲過程,有這是一個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;
這將是更自然的OUT參數,然而,有一個返回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
相匹配,則更不可能是個好主意。強迫每個開發人員總是在每個標識符周圍使用雙引號,並且總是在正確的情況下指定它們會導致比僅僅使用默認的不區分大小寫的約定和避免保留字更多的錯誤。
如果SQL語句user473104運行,則需要所有雙引號 - 「Merch」似乎是區分大小寫的標識符。如果'Merch'傳入'varchar2',那麼'Id''是'number'也可能導致問題 - 你最好使用''Merch'。「Id」%type'' –
我完全同意使用「Merch」。「Id」%類型。你能否詳細說一下雙引號?我不明白他爲什麼需要他的案件。 – Ulises
如果用雙引號將標識符括起來,Oracle會將其解釋爲區分大小寫的標識符。這意味着它只會匹配也使用區分大小寫的標識符創建的對象,並且僅當數據字典中的對象名稱的大小寫與雙引號中的對象名稱的大小相匹配時。如果原始SQL語句正常工作,則表示「Merch」表被創建爲「CREATE TABLE」Merch「...」,並且每個對「Merch」的引用都必須包含雙引號,並且必須區分大小寫 –