我正在使用SQL Oracle构建存储过程。我正在尝试构建下面的SQL查询的存储过程
SELECT "Merch"."Id", "Order"."Id", "Order"."OrderExt"
FROM "Order"
Join "Merch" ON "Order"."MerchId" = "Merch"."Id"
WHERE "Merch"."Id" = 25 AND "Order"."OrderExt" = 'TC10045604'
我想使用2个参数来比较“Merch.Id”和“Order.OrderExt”。我是SQL-Oracle的新手,并且很难弄清楚如何编写这个程序。
我遇到的一个问题是如何使用“Merch”返回表格。“Id”,“Order”。“Id”,“Order”。“OrderExt”?
我是否以某种方式使用光标?
有人可以帮我解决这个问题吗?
答案 0 :(得分:4)
您可以编写一个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;
作为一般风格,具有区分大小写的表和列名称是非常非常好的主意。拥有与Order
等Oracle保留字匹配的表名更不可能成为一个好主意。强制每个开发人员始终在每个标识符周围使用双引号并始终在正确的情况下指定它们将导致比您只是使用默认的不区分大小写的约定并避免使用保留字的错误。
答案 1 :(得分:2)
如您所说,您需要使用2个参数,以便按Merch.Id
和Order.OrderExt
过滤数据。
您可以使用SYS_REFCURSOR返回结果,例如:
PROCEDURE MY_PROC
( pOrderExt "Order"."OrderExt"%type,
pMerchId "Merch"."Id"%type,
recordSet OUT SYS_REFCURSOR )
AS
BEGIN
OPEN recordSet FOR
SELECT "Merch"."Id", "Order"."Id", "Order"."OrderExt"
FROM "Order"
INNER JOIN "Merch" ON "Order"."MerchId" = "Merch"."Id"
WHERE "Merch"."Id" = pMerchId AND "Order"."OrderExt" = pOrderExt;
END MY_PROC;
这是您看到结果的方式(确保您查看SQL Developer中的Out Variables选项卡):
DECLARE
pOrderExt "Order"."OrderExt"%type;
pMerchId "Merch"."Id"%type;
recordSet OUT SYS_REFCURSOR;
BEGIN
pMerchId := 25 ;
pOrderExt := 'TC10045604';
MY_PROC (
pMerchId => pMerchId,
pOrderExt => pOrderExt,
recordSet => recordSet
);
:recordSet := recordSet; --<-- Cursor
END;
已编辑:添加了执行示例,Justin Cave指出改进