Запустить хранимую процедуру без параметров можно следующим программным кодом:
var storedProcedure = new StoredProcedure(UserConnection, "tsp_Anny");
using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) {
dbExecutor.StartTransaction(System.Data.IsolationLevel.ReadUncommitted);
storedProcedure.Execute(dbExecutor);
dbExecutor.CommitTransaction();
}
return true;
Добрый день, хороший пример, как быть с параметрами
Пример
declare
i integer;
begin
"test1"('10700947',i);
end;
На BPMonline я написал так, но могу получить исходящий параметр
int k =0;
var storedProcedure = new StoredProcedure(userConnection,"test1");
storedProcedure.WithParameter("10700947");
storedProcedure.WithParameter(k);
storedProcedure.Execute();
Пример запуска хранимой процедуры с параметрами можно посмотреть в процессе карточки слияния дублей.
var storedProcedure = new StoredProcedure(UserConnection, "tsp_MergeDuplicates"); storedProcedure.WithParameter(Column.Const(EntityPrimaryColumnValue)); storedProcedure.WithParameter(Column.Const(entitiesToMerge)); storedProcedure.WithParameter(Column.Const(Page.DataSource.Schema.UId)); storedProcedure.WithOutputParameter("return_value", dataValueTypeManager.GetInstanceByName("Integer")); storedProcedure.WithOutputParameter("error_message", dataValueTypeManager.GetInstanceByName("Text")); using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { dbExecutor.StartTransaction(System.Data.IsolationLevel.ReadUncommitted); Page.DataSource.ActiveRow.Save(); storedProcedure.Execute(dbExecutor); if (storedProcedure.Parameters.Count > 0) { int result = (int)storedProcedure.Parameters[0].Value; string errorMessage = storedProcedure.Parameters[1].Value as string; if (result != 0) { dbExecutor.RollbackTransaction(); throw new Exception(errorMessage); } } dbExecutor.CommitTransaction(); } SetCloseStatus(1);
А есть пример получения из хранимой данные курсора из пакета оракл
Пример пакета
CREATE OR REPLACE PACKAGE INT4DB."tspkg_PaymentSchedule" AS TYPE "TypeCursorSchedule" IS REF CURSOR; PROCEDURE "GetProducts"(IDin IN NUMBER,DEP_IDin IN NUMBER, result_cursor IN OUT "TypeCursorSchedule"); END "tspkg_PaymentSchedule"; / CREATE OR REPLACE PACKAGE BODY INT4DB."tspkg_PaymentSchedule" AS PROCEDURE "GetProducts"(IDin IN NUMBER, DEP_IDin IN NUMBER, result_cursor IN OUT "TypeCursorSchedule") IS v_cursor "TypeCursorSchedule"; BEGIN OPEN v_cursor FOR SELECT code FROM colvir.ZHAS_VIU_GRAF@T_CRM_CORT2 WHERE ID = IDin --817514550 AND DEP_ID = DEP_IDin;-- 2; result_cursor := v_cursor; END "GetProducts"; END"tspkg_PaymentSchedule"; /
Сам попытался написать, но ругается на dataValueTypeManager
var dataValueTypeManager = (DataValueTypeManager)userConnection.AppManagerProvider.GetManager("DataValueTypeManager"); var storedProcedure = new StoredProcedure(userConnection,"GetProducts"); storedProcedure.WithParameter("817514550"); storedProcedure.WithParameter("2"); storedProcedure.WithOutputParameter("return_value", dataValueTypeManager.GetInstanceByName("REFCursor???")); storedProcedure.PackageName = "tspkg_PaymentSchedule";
Уточните, пожалуйста, какая у Вас версия и сборка BPMonline?
Для версии 5.1 запуск хранимой процедуры осуществляется иначе. Пример:
var contactSchemaId = new Guid("16BE3651-8FE2-4159-8DD0-A803D4683DD3"); //передаваемый в процедуру параметр var storedProcedure = new StoredProcedure(UserConnection, "tsp_GloballySearchForDuplicates"); storedProcedure.WithParameter(Column.Const(contactSchemaId)); using (var dbExecutor = UserConnection.EnsureDBConnection()) { storedProcedure.Execute(dbExecutor); } StoredProcedure setRecordPositionProcedure = new StoredProcedure(Page.UserConnection, "tsp_SetRecordPosition") .WithParameter("TableName", RightsSchemaName) .WithParameter("PrimaryColumnName", "Id") .WithParameter("PrimaryColumnValue", primaryColumnValue) .WithParameter("GrouppingColumnNames", RightsGrouppingColumnNames) .WithParameter("Position", position); setRecordPositionProcedure.PackageName = Page.UserConnection.DBEngine.SystemPackageName; setRecordPositionProcedure.Execute();
А я вот не совсем понял как запускать процедуру с параметрами. Без параметров запускается, хотя тоже не все понятно)
Например, что у нас хранится в dataValueTypeManager?
Как мне надо описать в BPMonline и запустить процедуру, которая должна получить входящим параметром ID текущего пользователя, ну и например № договора, из которого она запускается?
Версия BPMonline 5.2
Для того, чтобы получить идентификатор записи активной строки реестра из процесса карточки реестра, используйте следующую конструкцию:
Guid actId =Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id");
Соответственно, потом этот идентификатор следует передать в хранимую процедуру.
dataValueTypeManager - это ядровый менеджер, который в данном конкретном случае необходим, чтобы привести получаемый из процедуры параметр к определенному типу.
Анна, а не могли бы вы привести пример, о котором я говорил в предыдущем комментарии:
"D.T." написал:Как мне надо описать в BPMonline и запустить процедуру, которая должна получить входящим параметром ID текущего пользователя, ну и например № договора, из карточки которого она запускается?
Версия BPMonline 5.2
Guid contractId =Page.DataSource.ActiveRow.GetTypedColumnValue<Guid>("Id"); //если мы в реестре договоров Guid currentUser = UserConnection.CurrentUser.ContactId; var dataValueTypeManager = (DataValueTypeManager)UserConnection.AppManagerProvider.GetManager("DataValueTypeManager"); var storedProcedure = new StoredProcedure(UserConnection, "tsp_MergeDuplicates"); storedProcedure.WithParameter(contractId); storedProcedure.WithParameter(currentUser); storedProcedure.WithOutputParameter("return_value", dataValueTypeManager.GetInstanceByName("Integer")); storedProcedure.WithOutputParameter("error_message", dataValueTypeManager.GetInstanceByName("Text")); using (DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { dbExecutor.StartTransaction(System.Data.IsolationLevel.ReadUncommitted); Page.DataSource.ActiveRow.Save(); storedProcedure.Execute(dbExecutor); if (storedProcedure.Parameters.Count > 0) { int result = (int)storedProcedure.Parameters[0].Value; string errorMessage = storedProcedure.Parameters[1].Value as string; if (result != 0) { dbExecutor.RollbackTransaction(); throw new Exception(errorMessage); } } dbExecutor.CommitTransaction(); } SetCloseStatus(1);