ORA 00936 ошибка вызова хранимой процедуры PL/SQL из веб-службы C#
Мне нужна помощь в вызове хранимой процедуры, предназначенной для добавления порядкового номера к каждой строке, добавленной с помощью метода POST веб-службы.
На данный момент я получаю это сообщение об ошибке: "Сообщение_об_исключении": "в Ora-20001: сделать следующей последовательности искусству.. -936 в Ora-00936: отсутствует выражение\нора-06512: на \"FOO_BAR.PROC_NEXT_SEQUENCE\", линия 19\нора-06512: в строке 1"
Процедура была успешно протестирована в SQL Developer.
Я использую VS2013 (обновление 5), .NET 4, Entity Framework v6.1. 3, ODP.net через Nuget, Oracle 11.2 и Postman.
Хранимая процедура
PROCEDURE PROC_NEXT_SEQUENCE( p_owner varchar2, p_table varchar2, p_seq_name varchar2, p_seq_value out number) AS v_sql varchar2(4000) ; v_seq_value number :=0; BEGIN if length(p_seq_name) >0 then v_sql := 'select '||p_owner||'.'||p_seq_name||'.nextval AS NV from dual'; else v_sql := 'select '||p_owner||'.'||p_table||'_seq.nextval AS NV from dual'; end if; execute immediate v_sql into v_seq_value; p_seq_value := v_seq_value; exception when others then raise_application_error(-20001, 'Get Next Sequence Failed.. '||sqlcode||' '||sqlerrm); end;
с#
using System; using System.Net; using System.Data; using System.Net.Http; using System.Web.Http; using System.Linq; using System.Web.Http.Description; using System.Collections.Generic; using Oracle.ManagedDataAccess.Client; using FooBarApi.Models; // POST: api/Location [HttpPost] [ResponseType(typeof(LOCATION))] [Route("", Name = "AddLocation")] public HttpResponseMessage AddLocation([FromBody]LOCATION Location) { // Access config file and connect to database OracleConnection conn = new OracleConnection("User Id=FOO_BAR; Password=foo_bar; Data Source=FOOBARTEST"); // Setup call to stored procedure OracleCommand cmd = new OracleCommand(); cmd.Connection = conn; cmd.CommandText = "PROC_NEXT_SEQUENCE"; cmd.CommandType = System.Data.CommandType.StoredProcedure; // Assign parameters cmd.Parameters.Add("p_owner", OracleDbType.Varchar2); cmd.Parameters.Add("p_table", OracleDbType.Varchar2); cmd.Parameters.Add("p_seq_name", OracleDbType.Varchar2); cmd.Parameters.Add("p_seq_value", OracleDbType.Decimal, 4000).Direction = ParameterDirection.Output; // Execute stored procedure conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); db.LOCATIONS.Add(Location); db.SaveChanges(); var response = Request.CreateResponse<LOCATION>(HttpStatusCode.Created, Location); string uri = Url.Link("GetLocations", new { LOSEQ = Location.LOSEQ }); response.Headers.Location = new Uri(uri); return response;}
Спасибо.
Что я уже пробовал:
Я пробовал многочисленные изменения кода, предложенные на различных форумах разработчиков, но из-за отсутствия у меня специальных знаний c#/Oracle мне начинает казаться, что я хожу по кругу.
Bernhard Hiller
cmd. Parameters. Add("p_owner", OracleDbType.Varchar2); - здесь вы определяете параметр. Где в вашем коде C# он получает значение?
Julian_h
Спасибо за ваш ответ, Бернхард.
В c# нет объявленных значений, и теперь я знаю, что это, по крайней мере, часть моей проблемы. Я очень новичок в этом типе dv, и моя кривая обучения должна была быть крутой. Я попытался добавить значения-cmd. Parameters.Add("p_table", OracleDbType.Varchar2). Value = LOCATION - но получил сообщение "не существует в текущем контексте", и я пытался понять, как ссылаться на эти значения в коде, но безуспешно.
Последняя позиция заключается в том, что я создал консольное приложение c#, содержащее код для вызова процедуры, и жестко закодировал параметры в этой процедуре, чтобы они соответствовали определенной БД/таблице. Это выполняется успешно и отображает ожидаемый порядковый номер в командной консоли. Таким образом, отображение параметров-это одна проблема, и я считаю, что моя попытка интегрировать код для выполнения процедуры-это другая. Я пришел к выводу, что код для выполнения процедуры должен быть разделен на свой собственный класс, в соответствии с лучшей практикой MVC. Я чувствую, что делаю определенный прогресс.