public async System.Threading.Tasks.Task ExecuteStoredProcedureWithOutputParamAsync()
        {
            var query = "UnitTestProc";

            var input = new Input
            {
                ConnectionString       = connectionString,
                CommandOrProcedureName = query,

                CommandType    = OracleCommandType.StoredProcedure,
                TimeoutSeconds = 60
            };

            var oracleParam = new OracleParametersForTask
            {
                DataType = OracleParametersForTask.ParameterDataType.Varchar2,
                Name     = "returnVal",
                Size     = 255
            };

            var output = new OutputProperties();

            output.OutputParameters    = new OracleParametersForTask[1];
            output.OutputParameters[0] = oracleParam;

            var result = await ExecuteCommand.Execute(input, output, _taskOptions);

            Assert.AreEqual(true, result.Success);
        }
        public async System.Threading.Tasks.Task InsertValuesViaParametersAsync()
        {
            var query = "INSERT INTO TestTable (textField) VALUES (:param1)";

            OracleParametersForTask ownOracleParam = new OracleParametersForTask
            {
                DataType = OracleParametersForTask.ParameterDataType.Varchar2,
                Name     = "param1",
                Value    = "Text from parameter"
            };

            var input = new Input
            {
                ConnectionString       = connectionString,
                CommandOrProcedureName = query,

                CommandType     = OracleCommandType.Command,
                TimeoutSeconds  = 60,
                InputParameters = new OracleParametersForTask[1]
            };

            input.InputParameters[0] = ownOracleParam;

            var output = new OutputProperties();

            var result = await ExecuteCommand.Execute(input, output, _taskOptions);

            Assert.AreEqual(true, result.Success);
        }
        public async System.Threading.Tasks.Task GatAndUseRefCursorToJtoken()
        {
            // Replicate of test of  https://docs.oracle.com/database/121/ODPNT/featRefCursor.htm#ODPNT319

            //////////////////////////////////////////////////
            /// Get refcursor

            var oracleParam = new OracleParametersForTask
            {
                DataType = OracleParametersForTask.ParameterDataType.RefCursor,
                Name     = "outRefPrm",
                Value    = DBNull.Value,
                Size     = 0
            };

            var output = new OutputProperties
            {
                DataReturnType = OracleCommandReturnType.Parameters
            };

            var input = new Input
            {
                ConnectionString       = connectionString,
                CommandOrProcedureName = "begin open :1 for select col1 from test; end;",
                CommandType            = OracleCommandType.Command,
                BindParametersByName   = false,
                TimeoutSeconds         = 60
            };

            output.OutputParameters    = new OracleParametersForTask[1];
            output.OutputParameters[0] = oracleParam;

            var result = await ExecuteCommand.Execute(input, output, _taskOptions);

            //////////////////////////////////////////////////
            /// Ref cursor to JToken

            var secondInput = new RefCursorToJTokenInput
            {
                Refcursor = result.Result[0]
            };

            var secondResult = ExecuteCommand.RefCursorToJToken(secondInput);

            StringAssert.Contains(@"[{""COL1"":1.0}]", JsonConvert.SerializeObject(secondResult.Result));
        }
        public async Task GetAndUseRefCursor()
        {
            // Replicate of test of  https://docs.oracle.com/database/121/ODPNT/featRefCursor.htm#ODPNT319

            // create table and procedure:

            /*
             * connect scott/tiger@oracle
             * create table test (col1 number);
             * insert into test(col1) values (1);
             * commit;
             *
             * create or replace package testPkg as type empCur is REF Cursor;
             * end testPkg;
             * /
             *
             * create or replace procedure testSP(param1 IN testPkg.empCur, param2 OUT NUMBER)
             * as
             * begin
             * FETCH param1 into param2;
             * end;
             * /
             */

            // Note this kind of usage of ref cursors don't work in frends. When run in frends task doesn't accept ref cursors as input parameters.

            //////////////////////////////////////////////////
            /// Get refcursor

            var oracleParam = new OracleParametersForTask
            {
                DataType = OracleParametersForTask.ParameterDataType.RefCursor,
                Name     = "outRefPrm",
                Value    = DBNull.Value,
                Size     = 0
            };

            var output = new OutputProperties
            {
                DataReturnType = OracleCommandReturnType.Parameters
            };

            var input = new Input
            {
                ConnectionString       = connectionString,
                CommandOrProcedureName = "begin open :1 for select col1 from test; end;",
                CommandType            = OracleCommandType.Command,
                BindParametersByName   = false,
                TimeoutSeconds         = 60
            };

            output.OutputParameters    = new OracleParametersForTask[1];
            output.OutputParameters[0] = oracleParam;

            var result = await ExecuteCommand.Execute(input, output, _taskOptions);

            //////////////////////////////////////////////////
            /// Use refcursor

            var secondInput = new Input
            {
                ConnectionString       = connectionString,
                CommandOrProcedureName = "testSP",
                CommandType            = OracleCommandType.StoredProcedure,
                InputParameters        = new OracleParametersForTask[1],
                BindParametersByName   = false,
                TimeoutSeconds         = 60
            };

            OracleParametersForTask secondInputParameters = new OracleParametersForTask
            {
                DataType = OracleParametersForTask.ParameterDataType.RefCursor,
                Name     = "param1",
                Value    = result.Result[0].Value,
                Size     = 0
            };

            secondInput.InputParameters[0] = secondInputParameters;

            var secondOutputParameters = new OracleParametersForTask
            {
                DataType = OracleParametersForTask.ParameterDataType.Int32,
                Name     = "param2",
                Value    = DBNull.Value,
                Size     = 0
            };

            var secondOutput = new OutputProperties
            {
                OutputParameters = new OracleParametersForTask[1],
                DataReturnType   = OracleCommandReturnType.XmlString
            };

            secondOutput.OutputParameters[0] = secondOutputParameters;

            var secondResult = await ExecuteCommand.Execute(secondInput, secondOutput, _taskOptions);

            Assert.AreEqual("<Root>\r\n  <param2>1</param2>\r\n</Root>", secondResult.Result);
        }