Skip to Main Content

Oracle Database Discussions

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Unable to call stored procedure using Oracle.ManagedDataAccess.dll and .NET Framework

Paul ShermanDec 9 2023

The call is to Oracle EBS hr_employee_api.create_employee procedure.

I can call it using PL/SQL and it creates a user.

DECLARE
    p_employee_number VARCHAR2 (200);    
    p_person_id NUMBER;
    p_assignment_id NUMBER;
    p_per_object_version_number NUMBER;
    p_asg_object_version_number NUMBER;
    p_per_effective_start_date DATE;
    p_per_effective_end_date DATE;
    p_full_name VARCHAR2 (200);
    p_per_comment_id NUMBER;
    p_assignment_sequence NUMBER;
    p_assignment_number VARCHAR2 (200);
    p_name_combination_warning BOOLEAN;
    p_assign_payroll_warning BOOLEAN;
    p_orig_hire_warning BOOLEAN;
    
BEGIN
    hr_employee_api.create_employee (
        --p_validate => false,
        p_hire_date => TO_DATE('10-DEC-2023'), -- TRUNC(SYSDATE)
        p_business_group_id => 202, --this is the defalt business group for the vision edithion of the EBS
        p_last_name => 'Bobsky',
        p_first_name => 'Bob', -- not required
        p_sex => 'M',
        p_employee_number => p_employee_number,
        p_person_id => p_person_id,
        
        p_assignment_id => p_assignment_id,
        p_per_object_version_number => p_per_object_version_number,
        p_asg_object_version_number => p_asg_object_version_number,
        p_per_effective_start_date => p_per_effective_start_date,
        p_per_effective_end_date => p_per_effective_end_date,
        p_full_name => p_full_name,
        p_per_comment_id => p_per_comment_id,
        p_assignment_sequence => p_assignment_sequence,
        p_assignment_number => p_assignment_number,
        p_name_combination_warning => p_name_combination_warning,
        p_assign_payroll_warning => p_assign_payroll_warning,
        p_orig_hire_warning => p_orig_hire_warning);
    commit;
    DBMS_OUTPUT.PUT_LINE (p_employee_number); --To ensure that the data inserted successfully
EXCEPTION
WHEN OTHERS
THEN
    dbms_output.put_line(SQLERRM);    
END;
/		

But when I try to call the same procedure using C# (.NET Framework 4.7.2) and Oracle.ManagedDataAccess.dll (Product version 4.122.21.1) - see code below - I get an error:

ORA-03115: unsupported network datatype or representation

I tried various formats for ‘p_hire_date’ , numeric parameters but nothing helps.
Is it a bug in Oracle.ManagedDataAccess.dll?

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
using System.Xml.Linq;
using System.Runtime.InteropServices;
namespace ConnectorProject
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var ret = CallPackageFunction();
        }
        
        private static object CallPackageFunction()
        {
            string conStr = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=YES)(FAILOVER=YES)(ADDRESS=(PROTOCOL=tcp)(HOST=x.x.x.x)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=EBSDB)));User Id=apps;Password=****;";
            using (OracleConnection conn = new OracleConnection(conStr))
            {
                using (OracleCommand cmd = conn.CreateCommand())
                {
                    //============================================================
                    cmd.CommandText = "HR_EMPLOYEE_API.create_employee";
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.BindByName = true;
                    //=======================================================================
                    cmd.Parameters.Add("p_validate", OracleDbType.Boolean, ParameterDirection.Input).Value = false;
                    cmd.Parameters.Add("p_hire_date", OracleDbType.Date, ParameterDirection.Input).Value =  DateTime.Parse("10/12/2023").Date;
                    cmd.Parameters.Add("p_business_group_id", OracleDbType.Int32, ParameterDirection.Input).Value = 626; 
                    cmd.Parameters.Add("p_last_name", OracleDbType.Varchar2, ParameterDirection.Input).Value = "Bobsky";
                    cmd.Parameters.Add("p_first_name", OracleDbType.Varchar2, ParameterDirection.Input).Value = "Bob";
                    cmd.Parameters.Add("p_sex", OracleDbType.Varchar2, ParameterDirection.Input).Value = "M";
                                        
                    cmd.Parameters.Add("p_employee_number", OracleDbType.Varchar2, ParameterDirection.InputOutput);
                    cmd.Parameters.Add("p_person_id", OracleDbType.Int32, ParameterDirection.Output);
                    cmd.Parameters.Add("p_assignment_id", OracleDbType.Int32, ParameterDirection.Output);
                    cmd.Parameters.Add("p_per_object_version_number", OracleDbType.Int32, ParameterDirection.Output);
                    cmd.Parameters.Add("p_asg_object_version_number", OracleDbType.Int32, ParameterDirection.Output);
                    cmd.Parameters.Add("p_per_effective_start_date", OracleDbType.Date, ParameterDirection.Output);
                    cmd.Parameters.Add("p_per_effective_end_date", OracleDbType.Date, ParameterDirection.Output);
                    cmd.Parameters.Add("p_full_name", OracleDbType.Varchar2, ParameterDirection.Output);
                    cmd.Parameters.Add("p_per_comment_id", OracleDbType.Int32, ParameterDirection.Output);
                    cmd.Parameters.Add("p_assignment_sequence", OracleDbType.Int32, ParameterDirection.Output);
                    cmd.Parameters.Add("p_assignment_number", OracleDbType.Varchar2, ParameterDirection.Output);
                    cmd.Parameters.Add("p_name_combination_warning", OracleDbType.Boolean, ParameterDirection.Output);
                    cmd.Parameters.Add("p_assign_payroll_warning", OracleDbType.Boolean, ParameterDirection.Output);
                    cmd.Parameters.Add("p_orig_hire_warning", OracleDbType.Boolean, ParameterDirection.Output);
                    
                    //cmd.Parameters.Add("person_type_id", OracleDbType.Long, ParameterDirection.Input).Value = 13;
                    //cmd.Parameters.Add("middle_names", OracleDbType.Varchar2, ParameterDirection.Input);                            
                    //cmd.Parameters.Add("person_type_id", OracleDbType.Long, ParameterDirection.Input);
                    //cmd.Parameters.Add("title", OracleDbType.Varchar2, ParameterDirection.Input);
                    //cmd.Parameters.Add("email_address", OracleDbType.Varchar2, ParameterDirection.Input);
                    //cmd.Parameters.Add("marital_status", OracleDbType.Varchar2, ParameterDirection.Input);
                    //cmd.Parameters.Add("nationality", OracleDbType.Varchar2, ParameterDirection.Input);
                    //cmd.Parameters.Add("national_identifier", OracleDbType.Varchar2, ParameterDirection.Input);
                    //cmd.Parameters.Add("date_of_birth", OracleDbType.Date, ParameterDirection.Input);
                    //cmd.Parameters.Add("town_of_birth", OracleDbType.Varchar2, ParameterDirection.Input);
                    //cmd.Parameters.Add("region_of_birth", OracleDbType.Varchar2, ParameterDirection.Input);
                    //cmd.Parameters.Add("country_of_birth", OracleDbType.Varchar2, ParameterDirection.Input);
                    //cmd.Parameters.Add("supervisor_id", OracleDbType.Long, ParameterDirection.Input);
                    //cmd.Parameters.Add("job_id", OracleDbType.Long, ParameterDirection.Input);
                    //cmd.Parameters.Add("position_id", OracleDbType.Long, ParameterDirection.Input);
                    //cmd.Parameters.Add("set_of_books_id", OracleDbType.Long, ParameterDirection.Input);
                    //cmd.Parameters.Add("termination_date", OracleDbType.Date, ParameterDirection.Input);
                    //cmd.Parameters.Add("asg_effective_start_date", OracleDbType.Date, ParameterDirection.Input);
                    //cmd.Parameters.Add("default_expense_account", OracleDbType.Varchar2,  ParameterDirection.Input);
                    try
                    {
                        conn.Open();                       
                        cmd.ExecuteNonQuery();                        
                    }
                    catch (OracleException ex)
                    {
                        // Capture specific Oracle exception details
                        for (int i = 0; i < ex.Errors.Count; i++)
                        {
                            Console.WriteLine("Index #" + i + "\n" +
                                "Error: " + ex.Errors[i].ToString() + "\n");
                        }
                    }
                    catch (Exception ex)
                    {
                        System.Console.WriteLine("Exception: {0}", ex.ToString());
                    }
                    finally { conn.Close(); }
                }
            }                        
            return "";
        }    
    }
}

Here is stack trace:

at OracleInternal.ServiceObjects.OracleConnectionImpl.VerifyExecution(Int32& cursorId, Boolean bThrowArrayBindRelatedErrors, SqlStatementType sqlStatementType, Int32 arrayBindCount, OracleException& exceptionForArrayBindDML, Boolean& hasMoreRowsInDB, Boolean bFirstIterationDone)
at OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText, OracleParameterCollection paramColl, CommandType commandType, OracleConnectionImpl connectionImpl, Int32 longFetchSize, Int64 clientInitialLOBFS, OracleDependencyImpl orclDependencyImpl, Int64[]& scnFromExecution, OracleParameterCollection& bindByPositionParamColl, Boolean& bBindParamPresent, OracleException& exceptionForArrayBindDML, OracleConnection connection, Boolean isFromEF)
at Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()
at ConnectorProject.Program.CallPackageFunction() in C:\1Identity\Products\Oracle EBS\HR Person\ConnectorProject\Program.cs:line 91

And this is Message from a declaring method: Method may only be called on a Type for which Type.IsGenericParameter is true.

Thank you.

Comments
Post Details
Added on Dec 9 2023
2 comments
799 views