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'

"Merch.Id" と "Order.OrderExt" を比較するために 2 つのパラメータを使用したいと考えています。私は SQL-Oracle の初心者で、このプロシージャの書き方を理解するのに本当に苦労しています。

私が抱えている問題の 1 つは、"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 の予約語に一致するテーブル名を使用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;

編集:実行例を追加し、ジャスティン・ケイブが指摘したように改善しました

于 2012-05-07T15:04:22.903 に答える