1

This is my PL/SQL code:

create or replace PROCEDURE          "USP_TAXMASTER" (
    P_OPMODE      IN NUMBER DEFAULT 4 ,
    P_SALETYPE IN VARCHAR2 DEFAULT NULL,
    P_TAX_CODE        IN CHAR DEFAULT NULL ,
    P_TAX_NAME IN VARCHAR2 DEFAULT NULL ,
    P_TAX_PERCENT IN NUMBER DEFAULT 0,
    P_TAX_ON IN VARCHAR2 DEFAULT NULL ,
    --P_TAX_GROUP IN VARCHAR2 DEFAULT NULL ,
    P_STATUS IN VARCHAR2 DEFAULT NULL ,

    CV_1          IN OUT SYS_REFCURSOR,
    O_TAX_CODE OUT VARCHAR2
     )
AS
       V_TEMP     NUMBER;
      V_AUTO_NO  VARCHAR2(100);
      V_TAX_CODE   VARCHAR2(100);
      V_TEMP1    NUMBER;

It works fine when I call it from Oracle SQL Developer. But I am getting error ORA-6550: Wrong number of Arguments when I call it from C#. Below is my C# code snippet.

public void AssignmentParameterValues(OracleCommand cmd, TaxMasterVO.TaxMaster ObjTaxMaster, int opMode)

{
    cmd.Parameters.Add("P_OPMODE",OracleDbType.Int32, opMode,200,ParameterDirection.Input);
    cmd.Parameters.Add("P_SALETYPE", OracleDbType.Varchar2, 200, Equals(ObjTaxMaster.SaleType, null) ? "" : Convert.ToString(ObjTaxMaster.SaleType), ParameterDirection.Input);
    cmd.Parameters.Add("P_TAX_CODE", OracleDbType.Char, 200, Equals(ObjTaxMaster.TaxCode, null) ? "" : Convert.ToString(ObjTaxMaster.TaxCode), ParameterDirection.Input);
    cmd.Parameters.Add("P_TAX_NAME", OracleDbType.Varchar2, 200, Equals(ObjTaxMaster.TaxName, null) ? "" : Convert.ToString(ObjTaxMaster.TaxName), ParameterDirection.Input);
    cmd.Parameters.Add("P_TAX_PERCENT", OracleDbType.Decimal, 200, Equals(ObjTaxMaster.TaxPercentage, null) ? 0 : Convert.ToDecimal(ObjTaxMaster.TaxPercentage), ParameterDirection.Input);
    cmd.Parameters.Add("P_TAX_ON", OracleDbType.Varchar2, 200, Equals(ObjTaxMaster.TaxOn, null) ? "" : Convert.ToString(ObjTaxMaster.TaxOn), ParameterDirection.Input);
   // cmd.Parameters.Add("P_TAX_GROUP", OracleDbType.Varchar2, 200, Equals(ObjTaxMaster.TaxGroup, null) ? "" : Convert.ToString(ObjTaxMaster.TaxGroup), ParameterDirection.Input);
    cmd.Parameters.Add("P_STATUS", OracleDbType.Varchar2, 200, Equals(ObjTaxMaster.TaxStatus, null) ? "" : Convert.ToString(ObjTaxMaster.TaxStatus), ParameterDirection.Input);

    cmd.Parameters.Add("O_TAX_CODE", OracleDbType.Varchar2, 200);
    cmd.Parameters["O_TAX_CODE"].Direction = ParameterDirection.Output;

    cmd.Parameters.Add("CV_1", OracleDbType.RefCursor, 200);
    cmd.Parameters["CV_1"].Direction = ParameterDirection.InputOutput;
}

Below is the table Structure:

Name        Null?    Type         
----------- -------- ------------ 
TAX_CODE    NOT NULL CHAR(3)      
TAX_NAME    NOT NULL VARCHAR2(30) 
TAX_PERCENT NOT NULL NUMBER(5,2)  
TAX_ON      NOT NULL CHAR(3)      
STATUS               CHAR(1)      

I have tried different methods, but not able to fix the error. I even checked the table structure but still no luck. Am I making any mistake which I cannot find? Please suggest.

APC
  • 144,005
  • 19
  • 170
  • 281
Pokhraj
  • 13
  • 4
  • When I am running my procedure from Sql Developer, It is running fine, but when the same procedure I a calling from c#, I am getting error. – Pokhraj Aug 31 '19 at 11:31
  • 1
    I don't know much about C# but I can see that you add O_TAX_CODE parameter then you add CV_1 parameter. This is the reverse order of the procedure's signature. I'm assuming the procedure gets executed by applying parameters by **position** and not by **name**. Have you tried adding those parameters in the order which matches the procedure's signature? – APC Aug 31 '19 at 12:22
  • 1
    Try adding the line `cmd.BindByName = true;`. – Luke Woodward Aug 31 '19 at 19:10
  • By the way, using the nonstandard `CHAR` type is generally [asking for trouble](https://stackoverflow.com/a/42165653/230471). It is generally better to stick to the standard type. – William Robertson Sep 01 '19 at 09:12

0 Answers0