У меня есть Oracle база данных со следующей функцией
create or replace PACKAGE PCK_A IS
FUNCTION InsertPerson(
pi_FirstName IN person.firstname%type,
pi_LastName IN person.lastname%type,
pi_CompanyName IN person.companyname%type,
pi_Email IN person.emailaddress%type,
pi_Phone IN phonenumbers.phoneno%type,
pi_User IN user.name%type
) RETURN NUMBER;
Таблица PERSON определяется как
CREATE TABLE "person" (
"ID" NUMBER(7,0) NOT NULL ENABLE,
"EMAILADDRESS" VARCHAR2(60 BYTE),
"FIRSTNAME" VARCHAR2(50 BYTE) DEFAULT NULL,
"LASTNAME" VARCHAR2(50 BYTE) DEFAULT NULL,
"COMPANYNAME" VARCHAR2(100 BYTE) DEFAULT NULL,
CONSTRAINT "PK_PERSON" PRIMARY KEY ("ID"));
Мне нужно вызвать эту функцию в коде C#, поэтому я создал следующий метод:
public long InsertPerson(OracleConnection connection, OracleTransaction transaction) {
using (var cmd = connection.CreateCommand()) {
cmd.Transaction = transaction;
cmd.CommandText = @"begin
:personId := PCK_A.InsertPerson('Name', 'Surname', 'Company', 'mail@company.com', '123456789', 'user');
end;";
cmd.Parameters.Add("personId", OracleDbType.Decimal, ParameterDirection.ReturnValue).Size = 7;
cmd.ExecuteNonQuery();
return ((OracleDecimal) cmd.Parameters["contactPersonId"].Value).ToInt64();
}
}
Этот код работает правильно. Но когда я использую OracleParameter для параметра функции ExecuteNonQuery , выдает: Oracle .DataAccess.Client.OracleException: 'ORA-06502: PL / SQL: numeri c или ошибка значения: буфер строки символов слишком мал ORA-06512: в строке 2 '
Вот C# скорректированный метод, вызывающий проблему:
public long InsertPerson(OracleConnection connection, OracleTransaction transaction) {
using (var cmd = connection.CreateCommand()) {
cmd.Transaction = transaction;
cmd.CommandText = @"begin
:personId := PCK_A.InsertPerson(:pFirstName, 'Surname', 'Company', 'mail@company.com', '123456789', 'user');
end;";
cmd.Parameters.Add("pFirstName", OracleDbType.Varchar2, 50, contact.FirstName, ParameterDirection.Input);
cmd.Parameters.Add("personId", OracleDbType.Decimal, ParameterDirection.ReturnValue).Size = 7;
cmd.ExecuteNonQuery();
return ((OracleDecimal) cmd.Parameters["contactPersonId"].Value).ToInt64();
}
}
Что не так?