2015-07-03 3 views
7

У меня есть процедура оракул магазина, который занимает от 2 строки и даты в входном parametter и которые дают реф курсор в качестве вывода:Вызов оракула хранимых процедур с EF сбоем

CREATE OR REPLACE PROCEDURE SCHEMA.MYPROSTO (
    pPl IN  VARCHAR2, -- Comma (;) separated 
    pTy IN  VARCHAR2,-- Comma (;) separated 
    pDate  IN  mytable.mydate%TYPE, 
    pCursor  OUT sys_refcursor) 
IS 
    ..... 
    sSQL  VARCHAR2 (3000); 
BEGIN 

    -- making SQL Order 
    sSQL := 'SELECT TO_CHAR (v.date_c........ 

    ...... 


    OPEN pCursor FOR sSQL; 

END MYPROSTO; 

Выходного курсор возвращающего набор из 3 строки строковых ячеек.

Я импортировал эту хранимую процедуру в моей Entity Framework модели с этим в файле .config:

<oracle.manageddataaccess.client> 
<version number="*"> 
    <implicitRefCursor> 
    <storedProcedure schema="SCHEMA" name="MYPROSTO"> 
     <refCursor name="PCURSOR"> 
     <bindInfo mode="Output"/> 
     <metadata columnOrdinal="0" columnName="YEAR" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     <metadata columnOrdinal="1" columnName="MONTH" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     <metadata columnOrdinal="2" columnName="COUNT" providerType="Varchar2" allowDBNull="true" nativeDataType="Varchar2"/> 
     </refCursor> 
    </storedProcedure> 
    </implicitRefCursor> 
</version> 
</oracle.manageddataaccess.client> 

Wizzard функция импорта создает объект результата и сгенерировал функцию доступа:

public virtual ObjectResult<MYPROSTO_Result> MYPROSTO (string pPL, string pTY, Nullable<System.DateTime> pDATE) 
{ 
    var pPLParameter = pPL!= null ? 
     new ObjectParameter("PPL", pPL) : 
     new ObjectParameter("PPL", typeof(string)); 

    var pTYParameter = pTY!= null ? 
     new ObjectParameter("PTY", pTY) : 
     new ObjectParameter("PTY", typeof(string)); 

    var pDATEParameter = pDATE.HasValue ? 
     new ObjectParameter("PDATE", pDATE) : 
     new ObjectParameter("PDATE", typeof(System.DateTime)); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<MYPROSTO_Result>("MYPROSTO", pPLParameter, pTYParameter, pDATEParameter); 
} 

Однако вызов этой функции вызывает исключение (System.Data.Entity.Core.EntityCommandExecutionException) в последней строке:

ORA-06550: Ligne 1, colonne 8 : PLS-00306: wrong number or types of arguments in call to 'MYPROSTO' 
ORA-06550: Ligne 1, colonne 8 : PL/SQL: Statement ignored 

Я не понимаю, почему он не в состоянии

+0

Хорошо, что pDate сопоставляется с VARCHAR2? – bubi

+0

Что ты имеешь в виду? Вы предлагаете мне попробовать передать varchar вместо даты в моей хранимой процедуре? –

+0

Вы пытались взглянуть на http://docs.oracle.com/cd/E51173_01/win.122/e17732/featImplRefCursor.htm#ODPNT321? Кроме того, попробуйте изменить 'Varchar2' на' varchar2' в собственном типе данных (просто следуя инструкциям здесь, это Oracle, вы никогда не знаете). – flindeberg

ответ

3

Там, как представляется, несколько проблем:

  • Отправка VARCHAR (2) в поле даты
  • Имя параметра «PTy "против "PTYPE"
  • имя параметра "Закон о госзакупках" против "pPlant"
  • имя параметра "PPLT" против "PPL"
+0

Это была ошибка в моем процессе аннонимизации, см. Мое редактирование –

+0

Это может объяснить два из указанных выше пунктов, но не все 4 –

+0

Исправлено для последней опечатки. Однако, где вы видите varchar2 в дату? –

0

Что касается параметра возврата. Это «отображается» нормально? DoubleCheck

0

Конечно, ответ ясен в сообщении об ошибке:

«неверный номер или типы аргументов в вызове к„MYPROSTO“»

Ваша процедура ожидает 4 параметра, но вы только передача 3. Вам нужна переменная вывода для refcursor.

0

У меня случилось то же самое со мной, и НАКОНЕЦ решил. Я использовал oracle.manageddataaccess.client, как и вы, и мое решение .NET было разделено на проект презентации, проект WebAPI и проект доступа к данным. Мой app.config в проекте доступа к данным имел правильный раздел ImplicitRefCursor с определением курсора и метаданными, как и у вас, но я забыл также скопировать его в мой web.config моего проекта WebAPI. Как только я это сделал, ошибка «неправильного числа или типов аргументов» исчезла. Надеюсь, это поможет. (Я только что скопировал весь раздел oracle.manageddataaccess.client.)

Кроме того, если вы сгенерировали этот весь ImplicitRefCursor раздел вручную, я обнаружил гораздо более простой и надежный способ сделать это. Из проводника .NET Server подключитесь к своей базе данных, найдите свою хранимую процедуру, щелкните ее правой кнопкой мыши и запустите RUN. Тогда хорошо. Он отобразит список параметров IN и OUT, включая курсор. Если вы нажмете кнопку Show Config, она покажет вам, что должно быть в вашем EF app.config. Кнопка AddConfig добавит его для вас. Это помогает избежать ошибок.

Смежные вопросы