2013-02-19 1 views
6

Entity Framework를 통해 Oracle 11g의 저장 프로 시저에 액세스하려고합니다. 스칼라를 반환하는 저장 프로 시저에 액세스 할 수 있으며 올바른 값을 반환합니다. 그러나 결과 집합을 반환하기 위해 SYS_REFCURSOR를 사용하면 함수 가져 오기에서 OUT 매개 변수가 검색되지 않습니다.캔트 맵 Entity Framework의 SYS_REFCURSOR

내 저장 프로 시저

create or replace PROCEDURE "GetAllClientNames" (
    "ID" IN NUMBER, 
    "SAL" IN NUMBER, 
    "EMP_CURSOR" OUT SYS_REFCURSOR) IS 

BEGIN 


    OPEN EMP_CURSOR FOR SELECT FIRSTNAME FROM CLIENTS; 

END; 

아래 그러나 함수 가져 오기를 엔티티를 업데이트하고 수행 할 때 SYS_REFCURSOR OUT 매개 변수가 결과 집합을 검색하는 수입 기능에서 검출되지 않는 것입니다.

This is the image of imported function

나는 비슷한 문제가 있었다 저장 프로 시저

+0

저장 프로 시저를 '가져 오기'위한 프로세스는 무엇입니까? –

+1

@TomHalladay 저장 프로 시저를 Entity Framework에서 호출 할 수 있도록 함수로 가져와야합니다. –

답변

3

이제 오라클 데이터 공급자가 여기에 답변을 너무 정교한 많은 hustle.Its없이 작업의 이런 종류의 수 있습니다 여기에

은 참조를 위해 전체 기사입니다. 빠른 읽기가 추가됩니다. 자세한 내용은 아래 링크를 클릭하십시오.

ODP.NET 11g의 릴리스 2 (11.2.0.3.0), 이상은 .NET 코드에서 이러한 매개 변수의 바인딩을 명시 적 를 사용하지 않고 REF 커서 매개 변수를 사용하여 저장 프로 시저를 실행하는 응용 프로그램을 수 있습니다.

OracleDataReader를 사용하는 REF CURSOR와 같은 읽기 전용 결과 집합의 경우 REF CURSOR 스키마 정보는 자동으로 에서 검색됩니다. 갱신 REF 커서 또는 법인 프레임 워크를 사용하는 경우 일부 시나리오에 대해서는

같은 개발자는 응용 프로그램이 암시 REF 커서를 결합 할 수 있도록 REF의 커서 스키마 정보를 정의 할 필요가있다. Entity Framework 응용 프로그램은 에 대한 암시 적 REF CURSOR 바인딩을 사용하여 REF CURSOR 데이터에서 복잡한 유형을 인스턴스화합니다. 응용 프로그램은 app.config, web.config 또는 machine.config .NET 구성 파일에서 REF CURSOR 바인드 및 메타 데이터 정보를 지정해야합니다.

.NET 구성 파일에 제공된 속성은 응용 프로그램이 REF ​​CURSOR를 나타내는 OracleDataReader 객체에서 스키마 정보를 요청할 때도 으로 사용됩니다. 즉, 단일 테이블에서 SELECT를 사용하여 생성 된 REF CURSOR의 경우 은 응용 프로그램이 OracleDataAdapter 및 OracleCommandBuilder를 사용하여 해당 테이블을 업데이트 할 수 있음을 의미합니다.

Entity Framework를 사용할 때 함수 가져 오기는 암시 적으로 바인딩 된 REF CURSOR를 반환 할 수 있습니다. REF CURSOR는 복합 형식 또는 엔터티 형식 컬렉션으로 반환 될 수 있습니다. 복잡한 유형 컬렉션을 반환하려면 .NET 구성 파일에서 REF CURSOR 바인드 및 메타 데이터 정보를 정의해야합니다. 엔터티 형식 컬렉션을 반환하려면 바인딩 파일 만 .NET 구성 파일에 정의해야합니다.

것은 당신이해야 할 EF와 가져 오기 기능을 사용하려면 완전한 정보 here

2

에 의해 검색된 결과 집합에 액세스 할 수 없습니다 this.Without이 매개 변수를 OUT지고 나를 도와주십시오.

오랜 연구 끝에 엔터티 프레임 워크에 대한 오라클 지원이 스토어드 프로 시저의 리턴 유형으로 복잡한 데이터 유형을 사용하기 위해 아직 진화되지 않았 음을 알게되었습니다. 그것은 할 수있다; 그러나 그것은 당신의 머리 주위에 코를 만지고 있습니다. 따라서 EF를 쉽게 사용하려면 EF를 사용하지 말고 직접 저장 프로 시저를 사용하십시오.

마지막으로 EF를 사용하여 만들기, 업데이트 및 삭제 (결과적으로 감사 추적을 구현해야 함) 및 결과 집합을 반환하기위한 저장 프로 시저로 이동하기로 결정했습니다.

+0

안녕하세요 - 그렇다면 EF에서 SP를 어떻게 부르는 겁니까? 이렇게 : var result = db.Database.SqlQuery ("call OWI_ADMIN.S_LANDEN()"); ?? –

2

복잡한 반환 형식 및 이진 필드를 사용하여 저장 프로 시저 및 함수를 실행하려면 Entity 프레임 워크에서 Oracle 방식을 사용하는 것이 좋지 않다고 생각합니다.

+3

답장을 보내 주셔서 감사합니다. 질문자를 돕기 위해 나쁜 행동이 무엇인지에 대해 논평 할뿐만 아니라 건설적인 방법으로 앞으로 나아갈 수있는 방법에 대해서도 도움이 될 것입니다. 이 경우에 좋거나 더 좋은 방법은 무엇입니까? – Bex

3

참조 커서와 같은 복합 유형은 Entity Framework를 사용하여 Oracle 저장 프로 시저에서 반환 될 수 있습니다. 단지 약간의 추가 설정이 필요합니다. 구성 파일에 적절한 XML을 추가하여 반환되는 refcursor와 열의 데이터 형식을 식별해야합니다.

예 :

<oracle.dataaccess.client> 
<settings> 
    <add name="schema.storedproc.RefCursor.ref_cursor_param_name" value="implicitRefCursor bindinfo='mode=Output'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.0" value="implicitRefCursor metadata='ColumnName=<column_name_here>;BaseColumnName=<column_name_here>;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.1" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Date;ProviderType=Date'" /> 
    <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.2" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Number;ProviderType=Int32'" /> 
</settings> 
</oracle.dataaccess.client> 

그냥 당신과 함께 schema.storedproc 값을 대체합니다. ACCOUNTING.GET_EMPLOYEES와 같은. column_name_here을 열로 바꿉니다. EMP_ID와 같은. 꺾쇠 괄호도 제거하십시오. XML 항목에 http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/dotnet/EntityFrameworkOBE/EntityFrameworkOBE.htm#t3

문서 : http://docs.oracle.com/cd/E11882_01/win.112/e18754/featImplRefCursor.htm#ODPNT319

+0

더 이상 메타 데이터를 사용하여 해당 구성 파일을 직접 작성하지 않아도됩니다. "저장 프로 시저 실행"마법사가 대신 실행합니다. "article"에 대한 링크가 매우 오래되었습니다.대신이 페이지를 사용하십시오. https://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24이 페이지의 다른 곳에서 답을보십시오. –

3

찾기 다음 첫 번째 OUT SYS_REFCURSOR이 매개 변수 목록에서 발생

한 것은) 엔티티의 출력이 될 것이다 기능. 따라서 SP 또는 Function을이 OUT SYS_REFCURSOR가 포함 된 새로운 SP로 포장해야 할 수도 있습니다.

2)이 커서에 대한 일부 메타 데이터를 app.config 또는 web.config에 설정해야합니다. 이것은 서버 탐색기의 저장 프로 시저 실행 대화 상자에 의해 자동화됩니다. 이 주제에 대한 자세한 문서에 대해서는 https://apex.oracle.com/pls/apex/f?p=44785:24:6479673193812:::24:P24_CONTENT_ID,P24_PROD_SECTION_GRP_ID,P24_PREV_PAGE:10068,,24

의 Visual Studio 온라인 도움말에 대한 오라클 개발자 도구의 엔티티 프레임 워크 섹션을 참조하십시오

은 현재이 단계의 연습에 의해 단계를 볼 수 있습니다.