Запустить хранимую процедуру без параметров можно следующим программным кодом:
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();
Пример запуска хранимой процедуры с параметрами можно посмотреть в процессе карточки слияния дублей.
[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?
Для версии 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]