ORA-06550: número o tipos de argumentos erróenos

Recientemente tuve que desempolvar un proyecto de .NET (C#) y hacer unas modificaciones.
Había que utilizar las clases de System.Data.Oracle en vez de Oracle.DataAccess debido a que, la segunda, ocasionaba un timeout de conexión con la versión 11.2 de Oracle Database Server.

Una vez que sustituí las clases y corregí todos los errores de compilación ocasionados por el cambio, ejecute la aplicación para probar su funcionalidad. Para mi sorpresa me lanzó la siguiente excepción:

ORA-06550: línea 1, columna 7: PLS-00306: número o tipos de argumentos erróenos al llamar a ‘PR_GETEXPEDIENTESXFACUERDO’
ORA-06550: línea 1, columna 7: PL/SQL: Statement ignored

Verifiqué muchas veces que el número o tipo de los parámetros fuera el correcto, pero seguía sin funcionar. En un acto de desesperación sustituí la llamada al procedimiento por una consulta sql estándar, pero no tuve éxito. Ya sin más ideas noté que el nombre de los parámetros en el código era distinto a los nombres en el procedimiento almacenado. Intenté renombrarlos, ya sin nada que perder, y asombrosamente funcionó. Al parecer la clase OracleCommand de System.Data.Oracle toma en cuenta el nombre de los parámetros mientras que la de Oracle.DataAccess no.

Fuentes:
https://community.oracle.com/thread/2171363?start=0&tstart=0
http://support.microsoft.com/kb/322160
http://blogs.msdn.com/b/spike/archive/2009/06/16/oracle-stored-procedures-with-ref-cursor-from-net-code-and-bid-tracing.aspx

Anuncios

NET – Quitar acentos con C#

Pues el día de hoy necesitaba remover los acentos de unas cadenas para poder realizar una consulta. La respuesta la encontre aquí
Basado en ese código creé la siguiente clase para supuestamente mejorar el rendimiento, pero ni se nota 😉 jeje

public class Util
    {
        private const string consignos = “áàäéèëíìïóòöúùuÁÀÄÉÈËÍÌÏÓÒÖÚÙÜçÇ”;
        private const string sinsignos = “aaaeeeiiiooouuuAAAEEEIIIOOOUUUcC”;

        public static string removerAcentos(String texto)
        {
            StringBuilder textoSinAcentos = new StringBuilder(texto.Length);
            int indexConAcento;
            foreach (char caracter in texto)
            {
                indexConAcento = consignos.IndexOf(caracter);
                if (indexConAcento > -1)
                    textoSinAcentos.Append(sinsignos.Substring(indexConAcento, 1));
                else
                    textoSinAcentos.Append(caracter);
            }
            return textoSinAcentos.ToString();
        }
    }

Java XML Serialization vs .NET XML Serialization

Estoy haciendo un programa que genera reportes a partir de un archivo XML. La idea es que cuando se quiera un nuevo reporte o modificar alguno existente solo se tenga que cambiar la definicion del reporte en un archivo XML y no tener que modificar el codigo. Las clases que utilizo son las siguientes:

Esto lo hice en C# de forma sencilla mediante el uso de la clase System.Xml.Serialization.XmlSerializer y sus métodos Serialize y Deserialize. Esta clase me generó un XML como el siguiente:

<?xml version=”1.0″ encoding=”utf-8″?>
<Reporte xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xmlns:xsd=”http://www.w3.org/2001/XMLSchema”&gt;
<Nombre>Reporte de Prueba</Nombre>
<Consultas>
<Consulta>
<Nombre>Consulta 0</Nombre>
<SQL>SELECT * FROM CONSULTA_0</SQL>
</Consulta>
<Consulta>
<Nombre>Consulta 1</Nombre>
<SQL>SELECT * FROM CONSULTA_1</SQL>
</Consulta>
</Consultas>
</Reporte>

a mi parecer esta bastante limpio y se entiende lo suficiente para que una persona lo pueda modificar en cualquier editor de texto.
Luego quise hacer lo mismo en java y encontre que lo podia hacer mediante la clase java.beans.XMLEncoder y java.beans.XMLDecoder, y asi fue. El problema es que me genera XML como el siguiente:

<?xml version=”1.0″ encoding=”UTF-8″?>
<java version=”1.5.0_06″ class=”java.beans.XMLDecoder”>
<object class=”tsj.estadisticas.Reporte”>
<void property=”consultas”>
<void method=”add”>
<object class=”tsj.estadisticas.Consulta”>
<void property=”nombre”>
<string>Consulta 0</string>
</void>
<void property=”sql”>
<string>SELECT * FROM CONSULTA_0</string>
</void>
</object>
</void>
<void method=”add”>
<object class=”tsj.estadisticas.Consulta”>
<void property=”nombre”>
<string>Consulta 1</string>
</void>
<void property=”sql”>
<string>SELECT * FROM CONSULTA_1</string>
</void>
</object>
</void>
<void method=”add”>
<object class=”tsj.estadisticas.Consulta”>
<void property=”nombre”>
<string>Consulta 2</string>
</void>
<void property=”sql”>
<string>SELECT * FROM CONSULTA_2</string>
</void>
</object>
</void>
</void>
<void property=”nombre”>
<string>Nuevo Reporte</string>
</void>
</object>
</java>

Y pues no me gustó para nada, así que busqué otras alternativas.
Buscando en google encontré las 3 opciones que me parecieron mejores: JAXB, Simple y JiBX. Escogí Simple por simple… 😀 jeje … que es lo mismo a fácil de aprender, fácil de usar y eficiente, además de que en escencia es similar a la serializacion de C#.
Simple me produjo el siguiente XML:

<reporte>
<nombre>Nuevo Reporte</nombre>
<consultas class=”java.util.ArrayList”>
<consulta>
<nombre>Consulta 0</nombre>
<sql>SELECT * FROM CONSULTA_0</sql>
</consulta>
<consulta>
<nombre>Consulta 1</nombre>
<sql>SELECT * FROM CONSULTA_1</sql>
</consulta>
<consulta>
<nombre>Consulta 2</nombre>
<sql>SELECT * FROM CONSULTA_2</sql>
</consulta>
</consultas>
</reporte>

que es el mismo que en C# excepto por algunas líneas del encabezado.
El único problema que tuve para poder utilizar Simple fue por no haber leído el siguiente texto en la sección de descarga:

For Java 6 the framework has no external
dependancies and is completely self contained. For Java 5 two external JAR files are required,
the StAX API and the StAX implementation, both are provided with the download.

Como la version de java que utilizo es la 1.5, necesitaba tambien agregar las librerias indicadas. Estas librerias se encuentran en la carpeta “lib” donde hayas descomprimido Simple.
Si no las agregas te genera el siguiente error:

Exception in thread “main” java.lang.NoClassDefFoundError: javax/xml/stream/XMLInputFactory

C# – Ordenar las columnas de un ultratree

A diferencia del Ultragrid, el Ultratree no tiene una propiedad Header.VisiblePosition en sus columnas. Por ello, para cambiar el orden en que se despliegan las columnas tenemos que hacerlo a traves de su propiedad LayoutInfo de la siguiente forma:

primero nos enlazamos al evento ColumnSetGenerated

ultraTree1.ColumnSetGenerated+=new Infragistics.Win.UltraWinTree.ColumnSetGeneratedEventHandler(ultraTree1_ColumnSetGenerated);

en el evento le indicamos el orden de las columnas por medio de su propiedad OriginX

void ultraTree1_ColumnSetGenerated(object sender, Infragistics.Win.UltraWinTree.ColumnSetGeneratedEventArgs e)
{
e.ColumnSet.Columns[“Descripcion”].LayoutInfo.OriginX = 0;
e.ColumnSet.Columns[“Subtotal”].LayoutInfo.OriginX = 2;
e.ColumnSet.Columns[“Año”].LayoutInfo.OriginX = 4;
}

Notese que indicamos el indice desde 0 y vamos aumentando de 2 en 2, esto se debe a que por default (y no se porque, no he encontrado sentido en ello) la propiedad SpanX tiene un valor de 2. Es decir, nuestras columnas por default se expandiran 2 celdas. Una solucion seria hacer lo siguiente, que seria equivalente al codigo anterior

void ultraTree1_ColumnSetGenerated(object sender, Infragistics.Win.UltraWinTree.ColumnSetGeneratedEventArgs e)

{

e.ColumnSet.Columns[“Descripcion”].LayoutInfo.OriginX = 0;

e.ColumnSet.Columns[“Subtotal”].LayoutInfo.OriginX = 1;

e.ColumnSet.Columns[“Año”].LayoutInfo.OriginX = 2;

e.ColumnSet.Columns[“Descripcion”].LayoutInfo.SpanX = 1;

e.ColumnSet.Columns[“Subtotal”].LayoutInfo.SpanX = 1;

e.ColumnSet.Columns[“Año”].LayoutInfo.SpanX = 1;

}

con ello las columnas deberian desplegarse en el orden que le hemos indicado.

Referencias: http://news.infragistics.com/forums/t/1007.aspx