Есть несколько разных хранимок, т.е. есть только для чтения (селективные) и есть пишущие хранимки.
для создания UniStoredProc есть функция
Код: Выделить всё
// transR и transW - транзакции
//пишущая транзакция
transW := TUniTransaction.Create(connNotify);
transW.IsolationLevel := ilCustom;
transW.DefaultConnection := connNotify;
transW.SpecificOptions.Values['Params'] := 'write;nowait;rec_version;read_committed';
//читающая транзакция
transR := TUniTransaction.Create(connNotify);
transR.IsolationLevel := ilCustom;
transR.DefaultConnection := connNotify;
transR.SpecificOptions.Values['Params'] := 'read;nowait;rec_version;read_committed';
...
function CreateUniStoredProc(const name: string; isQuery: boolean = False): TUniStoredProc;
begin
result := TUniStoredProc.Create(connNotify);
result.Connection := connNotify;
result.StoredProcName := name;
result.Transaction := transR;
result.UpdateTransaction := transW;
result.PrepareSQL(isQuery);// False = not Query
end;
Код: Выделить всё
// процедура осуществляет только чтение данных из БД
SP_GET_PARENT_REGION_DETAIL := CreateUniStoredProc('SP_GET_PARENT_REGION_DETAIL');
// процедура осуществляет чтение и запись
SP_TTELEGRAMMAILINGPARAM_INSPAR := CreateUniStoredProc('SP_TTELEGRAMMAILINGPARAM_INSPAR');
Проблема в том, что на строке
Код: Выделить всё
SP_TTELEGRAMMAILINGPARAM_INSPAR.ExecSQL;
Так вот. Может вместо ExecSQL нужно какой-то другой метод дёргать, который затронет именно SP_TTELEGRAMMAILINGPARAM_INSPAR.UpdateTransaction?Project raised exception class EIBCError with message 'attempted update during read-only transaction
At procedure 'SP_TTELEGRAMMAILINGPARAM_INSPAR' line: 12, col: 3'.
Или же всё-таки придётся указывать в свойстве SP_TTELEGRAMMAILINGPARAM_INSPAR.Transaction пишущую транзакцию?
Как правильно?
Firebird 3
Delphi Tokyo
UniDAC 7.1.4