Oracle错误的数字或类型错误

时间:2013-11-05 14:20:53

标签: c# oracle

大家早上好,我来这几天试图做这项工作却找不到方法。我收到以下错误

ORA-06550: line 1, column 7: PLS-00306: wrong number or types 
                                          of arguments in call to 'ALTA_SOCIO'
ORA-06550: line 1, column 7: PL/SQL: Statement ignored

我不能发布图片,但如果不完全清楚,请原谅我

这是代码

   protected override void EjecutarConcreto()
    {
        int retornoNroSocio = (int)retorno.ObjetoGenerico;


        OracleParameter parameterNickname = new OracleParameter("p_nickname", OracleType.VarChar, 32767);
        parameterNickname.Direction = ParameterDirection.Input;
        parameterNickname.Value = nickname;
        ora_cmd.Parameters.Add(parameterNickname);

        OracleParameter parameterNombre = new OracleParameter("p_nombre", OracleType.VarChar, 32767);
        parameterNombre.Direction = ParameterDirection.Input;
        parameterNombre.Value = nombre;
        ora_cmd.Parameters.Add(parameterNombre);

        OracleParameter parameterApellido = new OracleParameter("p_apellido", OracleType.VarChar, 32767);
        parameterNombre.Direction = ParameterDirection.Input;
        parameterNombre.Value = apellido;
        ora_cmd.Parameters.Add(parameterApellido);


        OracleParameter parameterTipoDocumento = new OracleParameter("p_cod_tipo_documento", OracleType.VarChar, 32767);
        parameterTipoDocumento.Direction = ParameterDirection.Input;
        parameterTipoDocumento.Value = tipoDocumento;
        ora_cmd.Parameters.Add(parameterTipoDocumento);

        OracleParameter parameterNroDocumento = new OracleParameter("p_numero_documento", OracleType.Number);
        parameterNroDocumento.Direction = ParameterDirection.Input;
        parameterNroDocumento.Value = numeroDocumento;
        ora_cmd.Parameters.Add(parameterNroDocumento);

        OracleParameter parameterFechaNacimiento = new OracleParameter("p_fecha_nacimiento", OracleType.DateTime);
        parameterFechaNacimiento.Direction = ParameterDirection.Input;
        parameterFechaNacimiento.Value = fechaNacimiento;
        ora_cmd.Parameters.Add(parameterFechaNacimiento);

        OracleParameter parameterSexo = new OracleParameter("p_sexo", OracleType.VarChar, 32767);
        parameterSexo.Direction = ParameterDirection.Input;
        parameterSexo.Value = sexo;
        ora_cmd.Parameters.Add(parameterSexo);

        OracleParameter parameterCodCategoria = new OracleParameter("p_cod_categoria", OracleType.VarChar, 32767);
        parameterCodCategoria.Direction = ParameterDirection.Input;
        parameterCodCategoria.Value = codCategoria;
        ora_cmd.Parameters.Add(parameterCodCategoria);


        ora_cmd.Parameters.Add("p_numero_socio", OracleType.Number).Direction = ParameterDirection.Output;
        ora_cmd.Parameters.Add("p_codigo_error", OracleType.Number).Direction = ParameterDirection.Output;

        //Ejecuto el comando
        ora_cmd.ExecuteNonQuery();

这是表格

  NUMERO_SOCIO                     NUMBER(7) NOT NULL,

  NICKNAME                         VARCHAR2(25) NOT NULL,

  APELLIDO                         VARCHAR2(30) NOT NULL,

  NOMBRE                           VARCHAR2(30) NOT NULL,

  COD_TIPO_DOCUMENTO               VARCHAR2(10) NOT NULL,

  NRO_DOCUMENTO                    NUMBER(8) NOT NULL,

  COD_CATEGORIA                    VARCHAR2(10) NOT NULL,

  FECHA_NACIMIENTO                 DATE,

  SEXO                             VARCHAR2(1)

和程序:

PROCEDURE alta_socio(
    p_nickname IN VARCHAR2,
    p_nombre IN VARCHAR2,
    p_apellido IN VARCHAR2,
    p_cod_tipo_documento IN VARCHAR2,
    p_numero_documento IN NUMBER,
    p_fecha_nacimiento IN DATE,
    p_sexo IN VARCHAR2,
    p_cod_categoria IN VARCHAR2,
    p_numero_socio OUT NUMBER,
    p_codigo_error OUT NUMBER);



  [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    public RetornoNroSocio AltaSocio(string codUsuario, string claveUsuario, string establecimiento, string nick, string nombre, string apellido, int documento, DateTime fechaNacimiento, char sexo, string codCategoria)
    {
        RetornoNroSocio rn = new RetornoNroSocio() { NroSocio = 0 };

        if (codUsuario != null && claveUsuario != null && establecimiento != null && nick != null && codUsuario != null && nombre != null && apellido != null && (sexo == 'M' || sexo == 'F') && codCategoria != null)
        {
            //Verifico que si el documento es una cedula sea valido
            if (PUtiles.CedulaUruguaya.validarCedula(documento.ToString()))//REVISAR ESTA VALIDACION
            {
                //Verifico que el usuario tenga permisos

                RetornoBool rb = new SeguridadAccesoClub().TienePermiso(codUsuario, claveUsuario, Globales.ACC_VERIFICAR_SOCIO, Globales.MODO_INGRESO);

                //En caso de que no ocurra ningun error y el usuario tenga permisos 
                if (!rb.Error && rb.Resultado)
                {
                    //Verifico que el usuario no exista
                    int NumeroSocioSiExiste = ValidarSocio(establecimiento, codUsuario, claveUsuario, Globales.CODIGO_DATOS_DNI, documento.ToString()).NroSocio;
                    if (NumeroSocioSiExiste == 0)
                    {

                        //Creo y realizo la peticion a la API
                        PeticionAPI p = new AltaSocio(establecimiento, nick, nombre, apellido, Globales.DOCUMENTO_CI, documento, fechaNacimiento, sexo, codCategoria);
                        RetornoGenerico r = p.Ejecutar();
                        if (!r.Error)//si no hay error
                        {
                            rn.Codigo = 0;
                            rn.Mensaje = "Socio creado OK";
                            rn.NroSocio = (int)r.ObjetoGenerico;//El numero de socio

                        }
                        else//si hay error
                        {
                            rn.Codigo = -99;
                            rn.Mensaje = "Se produjo un error inesperado ";
                            rn.NroSocio = 0;
                            var _logger = log4net.LogManager.GetLogger("log4Net");
                            _logger.Error("Error al dar de alta un usuario " + 
                                r.MensajeError + " Datos: CodUsuario: "+ codUsuario +" ClaveUsuario: "+ claveUsuario
                                +" Establecimiento: " + establecimiento + " Nick: " + nick + " Nombre: "+ nombre +
                                " Apellido " + apellido + " Documento: " + documento + " FechaNacimiento: "+ fechaNacimiento +
                                " Sexo: " + sexo + " CodCategoria: " + codCategoria);   
                        } 

                    }
                    else
                    {
                        rn.Codigo = -1;
                        rn.Mensaje = "Este socio ya existe";
                        rn.NroSocio = NumeroSocioSiExiste;
                    }

                }
                else
                {
                    if (rb.Error)
                    {
                        rn.Codigo = -3;
                        rn.Mensaje = "Error al obtener los permisos del usuario";
                        rn.NroSocio = 0;
                        var _logger = log4net.LogManager.GetLogger("log4Net");
                        _logger.Error("rror al obtener los permisos del usuario " +
                            rb.MensajeError + " Datos: CodUsuario: " + codUsuario + " ClaveUsuario: " + claveUsuario
                            + " Establecimiento: " + establecimiento);   
                    }
                    else
                    {
                        rn.Codigo = -4;
                        rn.Mensaje = "El usuario no tiene los permisos de acceso necesarios para realizar la consulta.";
                        rn.NroSocio = 0;
                    }
                }
            }
            else
            {
                rn.Codigo = -2;
                rn.Mensaje = "Numero de cedula no es valido ";
                rn.NroSocio = 0;
            }
        }
        else
        {
            rn.Codigo = -5;
            rn.Mensaje = "Alguno de los campos es vacio";
            rn.NroSocio = 0;
        }

        return rn;

    }

命名空间WcfServicioAccesoCASClub.PConsumoAPIs {     公共抽象类PeticionAPI {

    private OracleConnection ora_conn;

    protected OracleCommand ora_cmd;
    protected string codEstablecimiento;
    protected string connectionString;
    protected string nombreProcedimiento;
    protected string nombreProcedimientoReal;
    protected CommandType tipoComando = CommandType.StoredProcedure;
    protected RetornoGenerico retorno;

    public RetornoGenerico Ejecutar() {
        InicializarRetorno();

        try {
            if (!string.IsNullOrEmpty(codEstablecimiento)) {
                connectionString = ObtenerConnectionString(codEstablecimiento);

                RetornoGenerico rg = OperacionPrevia();
                if (!rg.Error) {
                    ora_conn = new OracleConnection(connectionString);

                    ora_conn.Open();

                    CrearComando();

                    EjecutarConcreto();
                } else {
                    retorno.Error = true;
                    retorno.MensajeError = rg.MensajeError;
                }
            }else{
                retorno.Error = true;
                retorno.MensajeError = "No se recibio un establecimiento válido.";
            }

        } catch (Exception ex) {
            retorno.Error = true;
            retorno.MensajeError = string.Format("Error al ejecutar el comando {0}. \nDescripcion del error: {1}", nombreProcedimiento, ex.Message);
        } finally {
            if (ora_conn != null && ora_conn.State == ConnectionState.Open) {
                ora_conn.Close();
            }
        }

        return retorno;
    }

    protected virtual RetornoGenerico OperacionPrevia() {
        return new RetornoGenerico() { Error = false, MensajeError = string.Empty, ObjetoGenerico = null };
    }

    protected void CrearComando() {
        ora_cmd = new OracleCommand(nombreProcedimiento, ora_conn);
        ora_cmd.CommandType = tipoComando;
    }

    protected abstract void EjecutarConcreto();
    protected abstract void InicializarRetorno();

    protected string ObtenerConnectionString(string codEstablecimientoIn) {
        return GeneradorConnectionString.Instance.ObtenerConnectionString(codEstablecimientoIn);
    }

    protected string MensajeError(int nroError) {
        string mensajeError = string.Empty;

        ora_cmd = null;
        ora_cmd = new OracleCommand("cj_boldt.utl_terminales.obtener_error", ora_conn);
        ora_cmd.CommandType = CommandType.StoredProcedure;

        OracleParameter parameterNroSocio = new OracleParameter("p_codigo_error", OracleType.Number);
        parameterNroSocio.Direction = ParameterDirection.Input;
        parameterNroSocio.Value = nroError;
        ora_cmd.Parameters.Add(parameterNroSocio);
        OracleParameter parameterNombre = new OracleParameter("p_nombre_procedimiento", OracleType.VarChar, 32767);
        parameterNombre.Direction = ParameterDirection.Input;
        parameterNombre.Value = nombreProcedimientoReal;
        ora_cmd.Parameters.Add(parameterNombre);
        ora_cmd.Parameters.Add("p_mensaje_error", OracleType.VarChar, 32767).Direction = ParameterDirection.Output;

        //Ejecuto el comando
        ora_cmd.ExecuteNonQuery();

        //Obtengo los valores recibidos por parametro  
        try {
            mensajeError = ora_cmd.Parameters["p_mensaje_error"].Value.ToString();

        } catch (Exception ex) {
            mensajeError = "Ocurrio un error en la conexión";
        }

        return mensajeError;
    }

}

}

非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

  1. 存储过程和应用程序代码参数中的Varchar长度不同。设置适当的长度
  2. 一般代码看起来正确,问题可能在于使用ora_cmd。您可能在实际调用中有更多参数,因为之前添加了一些其他参数(例如,如果您调用此方法两次)。在新的电话会议之前不要忘记清除params。