powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вставка с помощью хранимой процедуры. Oracle
5 сообщений из 5, страница 1 из 1
Вставка с помощью хранимой процедуры. Oracle
    #37692974
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь сделать вставку в БД с помощью ХП,
вылетает ошибка:
Код: plsql
1.
2.
3.
4.
5.
6.
BEGIN
      W_MMKT.PK_STO.P_TEST_CREATE_ISPOB(:P0);
END;
 :P0 = 'MARATOSS_TEST1' TYPE :STRING(14), :P1 = NULL TYPE :STRING(0), :P2 
 = '' TYPE :STRING(0), :P3 = '1' TYPE :STRING(1)
 ORA-01036: illegal variable name/number



Не могу понять, что не так, вот сам вызов:
Код: c#
1.
session.Save(new DetailUnit { Value = "MARATOSS_TEST1", GUID = "1" });



Если вызывать ХП напрямую через ADO.NET, то все работает.
Где я ошибся, подскажите?

Вот маппинг:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class DetailUnitMap : ClassMap<DetailUnit>
{
    public DetailUnitMap()
    {
        this.Schema("W_KTSG");
        this.Table("V0_ISP_OB_S");
        this.Id(x => x.GUID).Column("RN_ISPOB");
        this.Map(x => x.Value).Column("OBOZN");
        this.Map(x => x.Code).Column("PACK_OBOZN");
        this.Map(x => x.MethodReceiptObject).Column("TIP_ISPOB").CustomType<MethodReceiptObjectMap>();
        this.SqlInsert("BEGIN W_MMKT.PK_STO.P_TEST_CREATE_ISPOB(?); END;");
    }
}



Вот процедура:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
   PROCEDURE P_TEST_CREATE_ISPOB(P_CODE IN STRING) AS
      NTEMP NUMBER;
    BEGIN
      IF (W_KTSG.PK_MMKT.F_USE_DOC(2000903753) = 2000903753) THEN
        NTEMP := W_KTSG.PK_MMKT.F_CREATE_ISPOB(P_OBJTYPE => 1000,
                                               P_OBOZN => P_CODE,
                                               P_VID => 'Т',
                                               P_INDMIZG => '1',
                                               P_TIP => 'С',
                                               P_RN_MAT => NULL,
                                               P_RN_RECP => NULL,
                                               P_RN_DRAW => NULL,
                                               P_START => TRUNC(SYSDATE));

        NTEMP := W_COMMON.PK_LOCK.UNLOCKNAME('PS2000903753');
      END IF;
    END;



А вот полный лог ошибки:
BEGIN W_MMKT.PK_STO.P_TEST_CREATE_ISPOB(:p0); END;:p0= 'MARATOSS_TEST1' [Type: String(14)], :p1= NULL [Type: String(0)], :p2= '' [Type: String(0)], :p3= '1' [Type: String(1)]
Couldnot execute command: BEGIN W_MMKT.PK_STO.P_TEST_CREATE_ISPOB(:p0); END;
System.Data.OracleClient.OracleException(0x80131938): ORA-01036: illegal variable name/number

at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleParameterBinding.Bind(OciStatementHandle statementHandle, NativeBuffer parameterBuffer, OracleConnection connection, Boolean& mustRelease, SafeHandle& handleToBind)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
at System.Data.OracleClient.OracleCommand.ExecuteNonQuery()
at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)
System.Data.OracleClient.OracleException(0x80131938): ORA-01036: illegal variable name/number

at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleParameterBinding.Bind(OciStatementHandle statementHandle, NativeBuffer parameterBuffer, OracleConnection connection, Boolean& mustRelease, SafeHandle& handleToBind)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
at System.Data.OracleClient.OracleCommand.ExecuteNonQuery()
at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)
at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
ORA-01036: illegal variable name/number

Couldnot synchronizedatabase statewith session
NHibernate.Exceptions.GenericADOException: couldnot insert: [InstrumentPreparation.DetailUnit#1][SQL: BEGIN W_MMKT.PK_STO.P_TEST_CREATE_ISPOB(?); END;] ---> System.Data.OracleClient.OracleException: ORA-01036: illegal variable name/number

at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleParameterBinding.Bind(OciStatementHandle statementHandle, NativeBuffer parameterBuffer, OracleConnection connection, Boolean& mustRelease, SafeHandle& handleToBind)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
at System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
at System.Data.OracleClient.OracleCommand.ExecuteNonQuery()
at NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand cmd)
at NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation expectation)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
--- End of inner exception stack trace ---
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session)
at NHibernate.Action.EntityInsertAction.Execute()
at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
at NHibernate.Engine.ActionQueue.ExecuteActions()
at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
...
Рейтинг: 0 / 0
Вставка с помощью хранимой процедуры. Oracle
    #37694704
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в процедуру и в маппинге добавить еще 3 входных параметра, то все работает
Код: c#
1.
this.SqlInsert("BEGIN W_MMKT.PK_STO.P_TEST_CREATE_ISPOB(?, ?, ?, ?); END;");


Код: plsql
1.
PROCEDURE P_TEST_CREATE_ISPOB(P_CODE STRING, P1 STRING, P2 STRING, P3 STRING);



Как добиться того, чтобы передавался только один параметр Value ?
...
Рейтинг: 0 / 0
Вставка с помощью хранимой процедуры. Oracle
    #37701487
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКак добиться того, чтобы передавался только один параметр Value?
Код: c#
1.
this.Map(x => x.Code).Column("PACK_OBOZN").Not.Insert();



Еще вопрос.
У меня добавляются данные из одной таблицы в другую, с помощью этой процедуры.
Как заполнить первичный ключ объекта, который сгенерировался, при сохранении?

Первичный ключ задается sequence.
...
Рейтинг: 0 / 0
Вставка с помощью хранимой процедуры. Oracle
    #37701497
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для понятности примерчик. Вот сохраняю:
Код: c#
1.
2.
3.
var dUnit = new DetailUnit { Value = "MARATOSS_TEST1", GUID = "1" };
session.Save(dUnit);
Console.WriteLine(dUnit.GUID); //Вот тут хочу чтоб вывелся гуид, который сгенерился в БД
...
Рейтинг: 0 / 0
Вставка с помощью хранимой процедуры. Oracle
    #37701597
maratoss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maratossДля понятности примерчик. Вот сохраняю:
Код: c#
1.
2.
3.
var dUnit = new DetailUnit { Value = "MARATOSS_TEST1", GUID = "1" };
session.Save(dUnit);
Console.WriteLine(dUnit.GUID); //Вот тут хочу чтоб вывелся гуид, который сгенерился в БД



Вот так сделал
Код: c#
1.
2.
this.Id(x => x.GUID).Column("RN_ISPOB").GeneratedBy.Identity();
this.SqlInsert("BEGIN W_MMKT.PK_STO.P_TEST_CREATE_ISPOB(?, :nhidOutParam); END;");



Код: plsql
1.
2.
PROCEDURE P_TEST_CREATE_ISPOB(P_CODE IN STRING, P_GUID OUT STRING)
...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Вставка с помощью хранимой процедуры. Oracle
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]