bpm
Хранимая процедура
хранимка

Запуск хранимой процедуры в BPMonline 5.2

Запустить хранимую процедуру без параметров можно следующим программным кодом:

var dataValueTypeManager = (DataValueTypeManager)UserConnection.AppManagerProvider.GetManager("DataValueTypeManager");

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;

Нравится

Поделиться

10 комментариев

Добрый день, хороший пример, как быть с параметрами
Пример

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();

Пример запуска хранимой процедуры с параметрами можно посмотреть в процессе карточки слияния дублей.

[csharp]
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);
[/csharp]

А есть пример получения из хранимой данные курсора из пакета оракл

Пример пакета
[sql]
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";
/

[/sql]

Сам попытался написать, но ругается на dataValueTypeManager
[csharp]
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";

[/csharp]

Уточните, пожалуйста, какая у Вас версия и сборка BPMonline?

BPMOnline Версия 5.1.1.139

Для версии 5.1 запуск хранимой процедуры осуществляется иначе. Пример:

[csharp]
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();

[/csharp]

А я вот не совсем понял как запускать процедуру с параметрами. Без параметров запускается, хотя тоже не все понятно)
Например, что у нас хранится в dataValueTypeManager?
Как мне надо описать в BPMonline и запустить процедуру, которая должна получить входящим параметром ID текущего пользователя, ну и например № договора, из которого она запускается?

Версия BPMonline 5.2

Для того, чтобы получить идентификатор записи активной строки реестра из процесса карточки реестра, используйте следующую конструкцию:

[csharp]
Guid actId =Page.DataSource.ActiveRow.GetTypedColumnValue("Id");
[/csharp]

Соответственно, потом этот идентификатор следует передать в хранимую процедуру.

dataValueTypeManager - это ядровый менеджер, который в данном конкретном случае необходим, чтобы привести получаемый из процедуры параметр к определенному типу.

Анна, а не могли бы вы привести пример, о котором я говорил в предыдущем комментарии:

"D.T." написал:

Как мне надо описать в BPMonline и запустить процедуру, которая должна получить входящим параметром ID текущего пользователя, ну и например № договора, из карточки которого она запускается?

Версия BPMonline 5.2

[csharp]
Guid contractId =Page.DataSource.ActiveRow.GetTypedColumnValue("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);
[/csharp]

Показать все комментарии