А есть пример получения из хранимой данные курсора из пакета оракл
Пример пакета
[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";
Для версии 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);
}
А я вот не совсем понял как запускать процедуру с параметрами. Без параметров запускается, хотя тоже не все понятно)
Например, что у нас хранится в dataValueTypeManager?
Как мне надо описать в BPMonline и запустить процедуру, которая должна получить входящим параметром ID текущего пользователя, ну и например № договора, из которого она запускается?
Соответственно, потом этот идентификатор следует передать в хранимую процедуру.
dataValueTypeManager - это ядровый менеджер, который в данном конкретном случае необходим, чтобы привести получаемый из процедуры параметр к определенному типу.
Анна, а не могли бы вы привести пример, о котором я говорил в предыдущем комментарии:
"D.T." написал:
Как мне надо описать в BPMonline и запустить процедуру, которая должна получить входящим параметром ID текущего пользователя, ну и например № договора, из карточки которого она запускается?
[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]