ORA-06550: строка 1, столбец 7: PLS-00306: неправильное количество или типы аргументов при вызове «INSERTBILL»

Привет, у меня проблема с вызовом процедуры хранения на сервере Oracle 10g.

Это моя таблица:

-- Create table
create table TMOBILE_R_BILLS
(
  ID                             VARCHAR2(50) not null,
  NO                             VARCHAR2(30) not null,
  SURNAME                        VARCHAR2(60) not null,
  NAME                           VARCHAR2(60) not null,
  BILL_MONTH                     NUMBER not null,
  VPS_TIME                       NUMBER not null,
  VPS_PRICE_WITH_DISCOUNT        NUMBER not null,
  VPS_PRICE_WITHOUT_DISCOUNT     NUMBER not null,
  TMOBILE_TIME                   NUMBER not null,
  TMOBILE_PRICE_WITH_DISCOUNT    NUMBER not null,
  TMOBILE_PRICE_WITHOUT_DISCOUNT NUMBER not null,
  ORANGE_TIME                    NUMBER not null,
  ORANGE_PRICE_WITH_DISCOUNT     NUMBER not null,
  ORANGE_PRICE_WITHOUT_DISCOUNT  NUMBER not null,
  O2_TIME                        NUMBER not null,
  O2_PRICE_WITH_DISCOUNT         NUMBER not null,
  O2_PRICE_WITHOUT_DISCOUNT      NUMBER not null,
  INTER_TIME                     NUMBER not null,
  INTER_PRICE_WITH_DISCOUNT      NUMBER not null,
  INTER_PRICE_WITHOUT_DISCOUNT   NUMBER not null,
  ROAMING_TIME                   NUMBER not null,
  ROAMING_PRICE_WITH_DISCOUNT    NUMBER not null,
  ROAMING_PRICE_WITHOUT_DISCOUNT NUMBER not null,
  GPRS_COUNT                     NUMBER not null,
  GPRS_PRICE_WITH_DISCOUNT       NUMBER not null,
  GPRS_PRICE_WITHOUT_DISCOUNT    NUMBER not null,
  LM_TIME                        DATE not null,
  TOTAL_TIME                     NUMBER not null,
  TOTAL_PRICE_WITH_DISCOUNT      NUMBER not null,
  TOTAL_PRICE_WITHOUT_DISCOUNT   NUMBER not null
)

вот процедура хранения:

    CREATE OR REPLACE PROCEDURE INSERTBILL(
      Id in varchar2, No in varchar2, Surname in varchar2, Name in varchar2,BillMonth in number,
      VpsTime in number, VpsPriceWithDiscount in number,VpsPriceWithoutDiscount in number,
      TmobileTime in number,TMobilePriceWithDiscount in number, TmobilePriceWithoutDiscount in number,
      OrangeTime in number, OrangePriceWithDiscount in number, OrangePriceWithoutDiscount in number,
      O2Time in number, O2PriceWithDiscount in number, O2PriceWithoutDiscount in number, InterTime in number,
      InterPriceWithDiscount in number, InterPriceWithoutDiscount in number, RoamingTime in number,
      RoamingPriceWithDiscount in number, RoamingPriceWithoutDiscount in number,
      GprsTime in number,GprsPriceWithDiscount in number, GrpsPriceWithoutDiscount in number, LmTime in date,
      TotalTime in number, TotalPriceWithDiscount in number, TotalPriceWithoutDiscount in number)
 AS
 BEGIN
   INSERT INTO TMOBILE_R_BILLS (ID,NO,SURNAME,NAME,BILL_MONTH,
          VPS_TIME,VPS_PRICE_WITH_DISCOUNT,VPS_PRICE_WITHOUT_DISCOUNT,
          TMOBILE_TIME, TMOBILE_PRICE_WITH_DISCOUNT,TMOBILE_PRICE_WITHOUT_DISCOUNT,
          ORANGE_TIME, ORANGE_PRICE_WITH_DISCOUNT,ORANGE_PRICE_WITHOUT_DISCOUNT,
          O2_TIME,  O2_PRICE_WITH_DISCOUNT,  O2_PRICE_WITHOUT_DISCOUNT,
          INTER_TIME,  INTER_PRICE_WITH_DISCOUNT,  INTER_PRICE_WITHOUT_DISCOUNT,
          ROAMING_TIME, ROAMING_PRICE_WITH_DISCOUNT, ROAMING_PRICE_WITHOUT_DISCOUNT,
          GPRS_COUNT, GPRS_PRICE_WITH_DISCOUNT,GPRS_PRICE_WITHOUT_DISCOUNT,
          LM_TIME,
          TOTAL_TIME,  TOTAL_PRICE_WITH_DISCOUNT,  TOTAL_PRICE_WITHOUT_DISCOUNT)
     VALUES (Id,No,Surname, Name,BillMonth,
             VpsTime,VpsPriceWithDiscount,VpsPriceWithoutDiscount,
             TmobileTime,TMobilePriceWithDiscount,TmobilePriceWithoutDiscount,
             OrangeTime,OrangePriceWithDiscount,OrangePriceWithoutDiscount,
             O2Time, O2PriceWithDiscount, O2PriceWithoutDiscount,
             InterTime,InterPriceWithDiscount,InterPriceWithoutDiscount,
             RoamingTime,RoamingPriceWithDiscount,RoamingPriceWithoutDiscount,
             GprsTime,GprsPriceWithDiscount,GrpsPriceWithoutDiscount,
             LmTime,TotalTime,TotalPriceWithDiscount,TotalPriceWithoutDiscount);
   END;

Это мой код С#, я использую массовую вставку SQL:

    public void InsertBills(List<CellPhoneBill> bills, int month)
    {
        var billsAsArrays = new BillDataAsArray(bills,month);

        using (var conn = new OracleConnection(GenerateConnectionString()))
        {

            var cmd = new OracleCommand
            {
                Connection = conn,
                CommandText = "INSERTBILL",
                CommandType = CommandType.StoredProcedure,
                ArrayBindCount = billsAsArrays.Ids.Count(),
            };

            cmd.Parameters.Add("Id", OracleDbType.Varchar2, billsAsArrays.Ids, ParameterDirection.Input);
            cmd.Parameters.Add("No", OracleDbType.Varchar2, billsAsArrays.Numbers, ParameterDirection.Input);
            cmd.Parameters.Add("Surname", OracleDbType.Varchar2, billsAsArrays.Surnames, ParameterDirection.Input);
            cmd.Parameters.Add("Name", OracleDbType.Varchar2, billsAsArrays.Names, ParameterDirection.Input);
            cmd.Parameters.Add("BillMonth", OracleDbType.Decimal, billsAsArrays.BillMonth, ParameterDirection.Input);
            cmd.Parameters.Add("LmTime", OracleDbType.Date, billsAsArrays.LmTimes, ParameterDirection.Input);

            cmd.Parameters.Add("VpsTime", OracleDbType.Decimal, billsAsArrays.VpsTimes, ParameterDirection.Input);
            cmd.Parameters.Add("VpsPriceWithDiscount", OracleDbType.Decimal, billsAsArrays.VpsPriceWithDiscounts, ParameterDirection.Input);
            cmd.Parameters.Add("VpsPriceWithoutDiscount", OracleDbType.Decimal, billsAsArrays.VpsPriceWithoutDiscounts, ParameterDirection.Input);

            cmd.Parameters.Add("TmobileTime", OracleDbType.Decimal, billsAsArrays.TmobileTimes, ParameterDirection.Input);
            cmd.Parameters.Add("TmobilePriceWithDiscount", OracleDbType.Decimal, billsAsArrays.TmobilePriceWithDiscounts, ParameterDirection.Input);
            cmd.Parameters.Add("TmobilePriceWithoutDiscount", OracleDbType.Decimal, billsAsArrays.TmobilePriceWithoutDiscounts, ParameterDirection.Input);

            cmd.Parameters.Add("OrangeTime", OracleDbType.Decimal, billsAsArrays.OrangeTimes, ParameterDirection.Input);
            cmd.Parameters.Add("OrangePriceWithDiscount", OracleDbType.Decimal, billsAsArrays.OrangePriceWithDiscounts, ParameterDirection.Input);
            cmd.Parameters.Add("OrangePriceWithoutDiscount", OracleDbType.Decimal, billsAsArrays.OrangePriceWithoutDiscounts, ParameterDirection.Input);

            cmd.Parameters.Add("O2Time", OracleDbType.Decimal, billsAsArrays.O2Times, ParameterDirection.Input);
            cmd.Parameters.Add("O2PriceWithDiscount", OracleDbType.Decimal, billsAsArrays.O2PriceWithDiscounts, ParameterDirection.Input);
            cmd.Parameters.Add("O2PriceWithoutDiscount", OracleDbType.Decimal, billsAsArrays.O2PriceWithoutDiscounts, ParameterDirection.Input);

            cmd.Parameters.Add("InterTime", OracleDbType.Decimal, billsAsArrays.InterTimes, ParameterDirection.Input);
            cmd.Parameters.Add("InterPriceWithDiscount", OracleDbType.Decimal, billsAsArrays.InterPriceWithDiscounts, ParameterDirection.Input);
            cmd.Parameters.Add("InterPriceWithoutDiscount", OracleDbType.Decimal, billsAsArrays.InterPriceWithoutDiscounts, ParameterDirection.Input);

            cmd.Parameters.Add("RoamingTime", OracleDbType.Decimal, billsAsArrays.RoamingTimes, ParameterDirection.Input);
            cmd.Parameters.Add("RoamingPriceWithDiscount", OracleDbType.Decimal, billsAsArrays.RoamingPriceWithDiscounts, ParameterDirection.Input);
            cmd.Parameters.Add("RoamingPriceWithoutDiscount", OracleDbType.Decimal, billsAsArrays.RoamingPriceWithoutDiscounts, ParameterDirection.Input);

            cmd.Parameters.Add("GprsTime", OracleDbType.Decimal, billsAsArrays.GprsTimes, ParameterDirection.Input);
            cmd.Parameters.Add("GprsPriceWithDiscount", OracleDbType.Decimal, billsAsArrays.GprsPriceWithDiscounts, ParameterDirection.Input);
            cmd.Parameters.Add("GprsPriceWithoutDiscount", OracleDbType.Decimal, billsAsArrays.GprsPriceWithoutDiscounts, ParameterDirection.Input);

            cmd.Parameters.Add("TotalTime", OracleDbType.Decimal, billsAsArrays.TotalTimes, ParameterDirection.Input);
            cmd.Parameters.Add("TotalPriceWithDiscount", OracleDbType.Decimal, billsAsArrays.TotalPriceWithDiscounts, ParameterDirection.Input);
            cmd.Parameters.Add("TotalPriceWithoutDiscount", OracleDbType.Decimal, billsAsArrays.TotalPriceWithoutDiscounts, ParameterDirection.Input);

            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }

            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {

                conn.Close();
            }
        }
    }

Проблема в том, что если я тестирую процедуру в разработчике PL/SQL, все работает хорошо. Но если я попытаюсь вызвать эту процедуру из кода С#, я получу эту ошибку:

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'INSERTBILL'
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'INSERTBILL'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

ИЗВИНИТЕ, Я ПУБЛИКУЮ СТАРЫЙ И НЕПРАВИЛЬНЫЙ КОД: "LmTime: paramater находится в коде C#. Но ошибка такая же. Я думаю, что что-то не так с типом параметров. В oracle все числовое, а в коде C# все десятичное, если значение это число. Как определить проблемную часть кода?

Спасибо за совет.


person Community    schedule 17.08.2011    source источник
comment
(разве у вас не должна быть отдельная таблица времени/цены/суммы?) в любом случае, где LM_time в коде C#?   -  person andrew cooke    schedule 18.08.2011


Ответы (2)


Правилен ли порядок ваших параметров в коде С#, который вы разместили? В ваших определениях параметров это 6-й параметр. В списке параметров процедуры он четвертый с конца. Это объяснило бы это, если действительно ваш опубликованный код - это то, с чем вы получаете ошибку.

Если нет, то как бы я это сделал, я бы изменил мою процедуру, чтобы предоставить значения по умолчанию для второй половины списка параметров и убрать их из вашего кода С#. Если это все еще не удается, задайте значения по умолчанию для второй половины оставшихся параметров, удалите их из кода и запустите снова. Повторяйте до тех пор, пока проблема не будет выявлена.

person DCookie    schedule 17.08.2011

Вы устанавливаете 29 параметров в своем вызове С#, ваша хранимая процедура имеет 30 параметров. Отсюда wrong number or types of arguments in call to 'INSERTBILL'.

РЕДАКТИРОВАТЬ: вам не хватает параметра LmTime в вашем коде С#.

person dee-see    schedule 17.08.2011
comment
ИЗВИНИТЕ, Я ОПУБЛИКОВАЛ СТАРЫЙ И ПЛОХОЙ КОД, LmTime: paramater находится в коде C #. Но ошибка та же. Я думаю, что что-то не так с типом параметров. В оракуле все является числом, а в коде С# все является десятичным, если значение является числом. - person ; 18.08.2011