0

Delphi および Oracle PL/SQL ストアド プロシージャに基づくレガシー アプリケーションがいくつかあります。これらのプロシージャの一部は、パラメータとして PL/SQL レコードを取ります。

create or replace package pck_search is

  type SearchParamsRecType is record(
    search_id       pls_integer,
    search_database pls_integer,
    search_mode     pls_integer,
    result_mode     pls_integer,
    wild_card       pls_integer);

  procedure PerformQuickSearch(p_cursor    in out sys_refcursor,
                               p_parameter in SearchParamsRecType);

end pck_search;

Web ベースのクライアント (ASP.Net MVC4) を追加したいと考えていますが、この種のストアド プロシージャでいくつかの問題に遭遇しました。Visual Studio 2012 でサーバー エクスプローラーを使用してストアド プロシージャをインポートしようとすると、次のエラー メッセージが表示されます。

The function 'PCK_SEARCH.PERFORMQUICKSEARCH' has a parameter 
'P_PARAMETER' at parameter index 0 that has a data type 'pl/sql record' 
which is currently not supported for the target .NET Framework version. 
The function was excluded.  

エラー メッセージをグーグルで調べたところ、2010年からのヒットは 1 つしか返されませんでした。そのときの答えは、「これは不可能です」でした。

したがって、私の質問は次のようになります。

  • エンティティ フレームワークを使用して、レコード タイプをパラメーターとして受け取る Oracle PL/SQL ストアド プロシージャをインポートすることは可能ですか?
  • この種のストアド プロシージャを処理できる Entity Framework の代替手段はありますか?
4

2 に答える 2

0

他に利用可能な回答がない場合にのみ、この回答を検討してください。私はまだ MVC の熟達者ではないので、アドバイスはできませんが、Oracle 側では、MVC が理解するデータ型を受け入れるラッパー プロシージャを使用することで、MVC に適したものにすることができます。

CREATE PACKAGE私は今テストする能力がないことに注意してください。以下は記憶からのものです。構文については保証しませんが、一般的な考え方は明らかであることを願っています。

CREATE OR REPLACE PACKAGE pck_wrap_search IS

  PROCEDURE PerformQuickSearch(
    p_cursor in out sys_refcursor,
    -- If MVC doesn't like pls_integer you could make these NUMBER values
    search_id       pls_integer,
    search_database pls_integer,
    search_mode     pls_integer,
    result_mode     pls_integer,
    wild_card       pls_integer);
  END PerformQuickSearch;

END pck_wrap_search;

CREATE OR REPLACE PACKAGE BODY pck_wrap_search IS

  PROCEDURE PerformQuickSearch(
    p_cursor in out sys_refcursor,
    search_id       pls_integer,
    search_database pls_integer,
    search_mode     pls_integer,
    result_mode     pls_integer,
    wild_card       pls_integer)
  IS
    -- I'm not sure if you need to initialize this somehow.
    searchParams pck_search.SearchParamsRecType;
  BEGIN
    -- Assemble the type that the "real" proc needs
    searchParams.search_id       := search_id;
    searchParams.search_database := search_database;
    searchParams.search_mode     := search_mode;
    searchParams.result_mode     := result_mode;
    searchParams.wild_card       := wild_card;
    -- Call the "real" proc
    pck_search.PerformQuickSearch(p_cursor, searchParams);
  END PerformQuickSearch;

END pck_wrap_search;

このアプローチでは、MVC はpck_wrap_search.PerformQuickSearch「単純な」データ型を使用してラッパーを呼び出し、ラッパーは「単純な」型を Oracle 型に入れ、「実際の」関数を呼び出します。きれいではありませんし、特効薬ではありませんが、動作するはずであり、既存のパッケージをいじる必要はありません。

于 2013-06-04T13:30:46.237 に答える
0

「PL/SQL レコード」、「PL/SQL 行タイプ」、および「SQL オブジェクト タイプ」を区別する必要があります。

レコードと行タイプは Oracle 固有のものであり、PL/SQL からのみアクセスできます。そのため、基本的に SQL を使用する EF の範囲外です。

そのため、オブジェクト型 (または Oracle が呼び出す「ユーザー定義型」) を使用する必要があります。

Oracle ユーザー定義型 (UDT) および .NET カスタム型に関する広範なドキュメントを次に示します。

于 2013-06-04T15:17:39.273 に答える