1

我看到很多类似的问题,但我看不出这里有什么问题。我有以下非常简单的 Oracle SP:

create or replace PROCEDURE "SP_PERSONAS_PADRON_BIENES"
(
  pcod_organizacion in number, 
  pnum_cedula in varchar2,
  pnum_bienes in number,
  pind_bienes in number, 
  ptip_bienes in number,
  pdes_bienes in varchar2, 
  pval_bienes in number,
  pfec_adquisicion in varchar2,
  ptip_modo   in  varchar2
) --tipo de modo I insertar U actualizar B borrar 
is
  vlcod_return number(4);                          --variable para almacenar el codigo de error de retorno.
  vlmsg_return tbl_errores.des_error%type := '';   --variable para almacenar el mensaje de retorno.
  vlnum_siguiente number(4) :=1;                   --siguiente numero de Bien para esta cedula.
  errorgenerico exception;
begin
    INSERT INTO debug values(pnum_cedula);
    if ptip_modo = 'AGREGAR_NORMAL' or ptip_modo = 'A' then  
        begin
            --recuperar el ultilmo mas 1
            begin
                select nvl(max(num_bienes),0) into vlnum_siguiente
                from tbl_personas_padron_bienes
                where cod_organizacion = pcod_organizacion
                and num_cedula       = pnum_cedula;

                vlnum_siguiente := vlnum_siguiente + 1;
            exception
                when no_data_found then 
                    vlnum_siguiente := 1;
                when others then 
                    vlnum_siguiente := 1;
            end; 

            insert into tbl_personas_padron_bienes (cod_organizacion,num_cedula,num_bienes,ind_bienes,tip_bienes,des_bienes,val_bienes ,fec_adquisicion, usu_incluye, fec_incluye, usu_modifica, fec_modifica)
            values (pcod_organizacion, pnum_cedula, vlnum_siguiente, pind_bienes, ptip_bienes, pdes_bienes, pval_bienes , pfec_adquisicion, user, sysdate, user, sysdate); 
        end;
    end if;
end;

如果我从 SQL Developer 执行它,执行 EXEC SP_PERSONAS_PADRON_BIENES .... 它会达到预期的效果。但是当我从 C# 调用它时,它给了我这个错误:

ORA-06550:第 1 行,第 34 列:PLS-00103:在预期以下情况之一时遇到符号“”::=。(@%;

private async Task EjecutarSpPersonasPadronBienes( Bien bien, string modo, string credencialesEncriptadas )
        {
            var credenciales = Encriptacion.ObtenerCredenciales( credencialesEncriptadas );
            var connection = new OracleConnection( Seguridad.CadenaDeConexion( credenciales, _connectionString ) );
            var command = connection.CreateCommand();
            command.Parameters.Add("pcod_organizacion", OracleDbType.Int32, bien.CodigoOrganizacion, ParameterDirection.Input );
            command.Parameters.Add("pnum_cedula", OracleDbType.Varchar2, bien.Cedula, ParameterDirection.Input );
            command.Parameters.Add("pnum_bienes", OracleDbType.Int32, bien.Id, ParameterDirection.Input );
            command.Parameters.Add("pind_bienes", OracleDbType.Int32, bien.TieneBienesInscritos, ParameterDirection.Input );
            command.Parameters.Add("ptip_bienes", OracleDbType.Int32, bien.Tipo, ParameterDirection.Input );
            command.Parameters.Add("pdes_bienes", OracleDbType.Varchar2, bien.Descripcion, ParameterDirection.Input );
            command.Parameters.Add("pval_bienes", OracleDbType.Double, bien.ValorEstimado, ParameterDirection.Input );
            command.Parameters.Add("pfec_adquisicion", OracleDbType.Varchar2, bien.FechaAdquisicion.ToString( "dd/MM/yyyy" ), ParameterDirection.Input );
            command.Parameters.Add("ptip_modo", OracleDbType.Varchar2, modo, ParameterDirection.Input );

            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "SP_PERSONAS_PADRON_BIENES";
            connection.Open();
            await command.ExecuteNonQueryAsync();

            if( connection.State == ConnectionState.Open )
            {
                connection.Close();
            }
        }//EjecutarSpPersonasPadronBienes

我有很多这样的电话,但这是唯一失败的电话。

4

1 回答 1

0

正如@madreflection 评论的那样“您在程序名称的末尾有一个零宽度字符,即在“S”和引号之间。奇怪的是,它是 BOM 字符,或零宽度无间断空格,U +FEFF。”

问题是带有存储过程名称的字符串中的一个特殊字符,我只是删除了文本并重新键入它,如果解决了问题。

于 2021-11-25T15:12:34.853 回答