Julian_h Ответов: 0

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. Я чувствую, что делаю определенный прогресс.

0 Ответов