2013-06-04 1 views
0

우리는 델파이와 오라클 PL/SQL 스토어드 프로 시저를 기반으로하는 몇 가지 레거시 애플리케이션을 가지고 있습니다.Oracle PL/SQL 프로 시저 및 레코드 유형을 함수로 사용하는 EF4의/대안에 대한 해결 방법은 무엇입니까?

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; 

우리는 이제 웹 기반 클라이언트 (ASP.Net MVC4)를 추가 할, 그러나 우리는 이런 종류의 몇 가지 문제로 실행 : 이러한 절차 중 일부는 예를 들어, 매개 변수로 PL/SQL 기록을 저장 프로 시저.

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. 

오류 메시지에 대한 인터넷 검색 만 one hit from 2010을 반환 - 대답은 그 다음이었다 "이것이 불가능"나는 비주얼 스튜디오 2012에서 서버 탐색기를 사용하여 저장 프로 시저를 가져 오려고하면이 오류 메시지가 표시됩니다.

그래서, 내 질문은 아래로 비등 :

  • 는 엔티티 프레임 워크를 사용하여 매개 변수로 레코드 유형을 오라클 PL/SQL 저장 프로 시저를 가져올 수 있습니까?
  • 이러한 종류의 저장 프로 시저를 처리 할 수있는 Entity Framework에 대한 대안이 있습니까?
+0

당신이이 일을 할 수있는 답을 찾았에 대한 설명서의 광대 한 작품이다? – Kar

+0

@Kar 우리는 Object Types (HAL9000에서 제안한 답변)로 전환했습니다. –

답변

0

"PL/SQL 레코드", "PL/SQL RowTypes"및 "SQL 개체 유형"을 구분해야합니다.

레코드 및 행 유형은 Oracle에만 있으며 PL/SQL에서만 액세스 할 수 있으므로 기본적으로 SQL을 사용하는 EF의 범위를 벗어납니다.

그래서 오브젝트 유형 (또는 Oracle이 호출 할 때 "사용자 정의 유형")을 사용해야합니다. 여기

Oracle User-Defined Types (UDTs) and .NET Custom Types

+0

내가 원하는 바가 아니지만 감사합니다. –

0

다른 대답이없는 경우에만이 대답을 고려하십시오. 저는 아직 MVC에서 능숙하지 않으므로 조언 할 수는 없지만 오라클 측에서는 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 래퍼를 부를 것이다, 그리고 래퍼는 오라클 유형으로 "간단한"형식을두고 "진짜"함수를 호출합니다. 귀엽지는 않지만 은색 총알은 아니지만 작동해야하며 기존 패키지를 망칠 필요가 없습니다.

+0

감사합니다. 나는 이것이 효과가 있다고 생각하지만 여분의 래퍼 패키지를 만들 필요가 없다. 따라서이 방법을 최후의 수단으로 만 사용할 것이다. –

+0

반갑습니다. 동의합니다. 이는 최후의 수단으로 만 사용할 수 있습니다. 행운을 빕니다! –

관련 문제