Oracle SQL Developer中的存储过程

时间:2012-05-07 14:53:54

标签: sql oracle stored-procedures oracle-sqldeveloper

我正在使用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”?

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

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

2 个答案:

答案 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.IdOrder.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指出改进