0

我正在使用 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" 的表?

我是否以某种方式使用光标?

有人可以帮我解决这个问题吗?

4

2 回答 2

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;

作为一般的风格问题,区分大小写的表和列名很少是一个好主意。并且拥有与 Oracle 保留字 like 匹配的表名Order更不可能是一个好主意。与仅使用默认的不区分大小写的约定并避免保留字相比,强制每个开发人员始终在每个标识符周围使用双引号并始终以正确的大小写指定它们会导致更多的错误。

于 2012-05-07T15:08:44.940 回答
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 所指出的那样进行了改进

于 2012-05-07T15:04:22.903 回答