jueves, marzo 29, 2012

BULK COLLECT en ORACLE

Bulk Collect es la forma como Oracle maneja arreglos. puedes usarlo si quieres evitar el uso excesivo de cursores. la ventaja de Bulk Collect es que se maneja en memoria y evita la escritura a disco, por lo cual resulta optimo guardar datos con Bulk Collect.

Hay que tener en cuenta que no debemos utilizar grandes cantidades de información con Bulk Collect porque la memoria del servidor Oracle se puede ver afectado y a la vez tambien afectar otros procesos.

Este es un pequeño ejemplo donde se pasa toda la informacion de la tabla PRODUCTOS al arreglo PRODUCTOS_COLECCION


CREATE TABLE PRODUCTOS
(
  COD_PRODUCTO VARCHAR(10),
  DES_PRODUCTO VARCHAR2(50),
  FLG_ACTIVO CHAR(1)
);

INSERT INTO PRODUCTOS VALUES ('1','ARROZ','S');
INSERT INTO PRODUCTOS VALUES ('2','ACEITE','S');
INSERT INTO PRODUCTOS VALUES ('3','AZUCAR','S');

DECLARE 
  
  TYPE PRODUCTO_FILA IS RECORD (COD_PRODUCTO VARCHAR(10),
                                DES_PRODUCTO VARCHAR2(50),
                                FLG_ACTIVO CHAR(1));
  
  TYPE TYPE_TABLA_PRODUCTOS IS TABLE OF PRODUCTO_FILA; 
  PRODUCTOS_COLECCION TYPE_TABLA_PRODUCTOS; 
  
 BEGIN
 
    SELECT COD_PRODUCTO,DES_PRODUCTO,FLG_ACTIVO
    BULK COLLECT INTO PRODUCTOS_COLECCION 
    FROM PRODUCTOS;
    
    --OBTENER LA DESCRICPION DE LOS PRODUCTOS
    FOR  I IN 1 .. PRODUCTOS_COLECCION.COUNT 
    LOOP
       DBMS_OUTPUT.PUT_LINE(PRODUCTOS_COLECCION(I).DES_PRODUCTO);    
    END LOOP;
    
 END;

ORA-01000: número máximo de cursores abiertos excedido

Este error se debe a que la sesión alcanzó el límite máximo permitido de cursores abiertos.

para solucionar este problema existen una serie de recomendaciones que van desde la manipulación de los parametros de la base de datos Oracle para que soporte mas cursores o la mejora de la aplicacion donde se originó el error.


Puedes obtener el número de cursores permitidos con la siguiente consulta:

SELECT VALUE FROM V$PARAMETER WHERE NAME='open_cursors';

para modificar este valor lo puedes hacer con la siguiente instrucción:


ALTER SYSTEM SET OPEN_CURSORS = 1000;

donde el numero 1000 será el máximo de cursores permitidos.

Hay que tener en cuenta que a pesar de elevar el número máximo de cursores permitidos esto va a depender del Sistema Operativo y del hardware.

Si este error te sucedió al ejecutar un procedimientos o script desde un programa enVisual Studio .NET, entonces hay una serie de mejores que debes tener en cuenta: 

la primera de ellas es hacer Dispose a los objetos que usas al momento ejecutar  la sentencia Oracle, cerrar el componente OracleDataReader.

A continuación dejo una tabla que indica a que objetos se puede hacer dispose y close.


Clase
Método close
Método Dispose
OracleConnection
si
si
OracleDataReader
si
si
OracleBFile
si
si
OracleBlob
si
si
OracleClob
si
si
OracleXmlStream
si
si
OracleCommand

si
OracleDataAdapter

si
OracleRefCursor

si
OracleParameter

si
OracleCommandBuilder

si
OracleTransaction

si
OracleXmlType

si
OracleGlobalization

si

miércoles, marzo 28, 2012

Crear un limpia pantalla en COBOL

El siguiente código debe ponerse debajo del WORKING-STORAGE SECTION.


SCREEN SECTION.
*--------------------------
01 MENU-SCREEN BLANK SCREEN  FOREGROUND-COLOR 7 BACKGROUND-COLOR 1.

y se debe imprimir en cualquier parrafo del PROCEDURE DIVISION. donde se desea comenzar nuevamente con la pantalla limpia. la forma como se imprime es:


DISPLAY MENU-SCREEN







Ejecutar una función JavaScript y luego el evento al hacer click en un Boton ASP.Net

En ocasiones es necesario validar información por el lado del cliente con JavaScript y luego ejecutar el evento del boton ASP.Net.

Para lograr esto el control Button cuenta con  las propieades OnClick y OnClientClick.

En el siguiente ejemplo se usa OnClientClick para ejecutar una función Javascript que valide datos, el cual devoverá true cuando todo sea correcto y false cuando haya algo que validar. Si la funcion JavaScript devuelve false el evento OnClick no se ejecutara.

En el siguiente ejemplo he agregado un formulario web llamado WebForm1.aspx, en donde he añadido 3 cajas de texto, un boton y un control literal para el mensaje de confirmación.

el usuario solo podrá grabar cuando todas las cajas de texto tengan algun valor. si alguna d las cajas de texto esta vacia entonces mostrará un mensaje diciendo que falta datos por validar, en caso de que todas las cajas de texto contengan algun valor entonces mostrará un mensaje preguntando si se desea realizar la transaccion, en caso de que el usuario acepte mostrará un mensaje en el control literal indicando que los datos fueron grabados.

Para este ejemplo existen dos momentos al hacer click en el boton Grabar, el primer momento es cuando se realiza la validacion de los datos con javascript, en el cual se mostraran los mensajes de pregunta o alerta segun el caso. una vez que se ha pasado todas las valdiaciones la función Validar() de javascript retornará un valor booleano. cuando es true automáticamente pasa a ejecutar el evento OnClick del boton que se ha programado del lado del servidor.

Este el código JavaScript que valida la información


 
        function Validar()
        {
            var error = 0;
            
            if (document.getElementById('<%=TextBox1.ClientID %>').value == '' )
            {
                error = 1;
            }
            if ( document.getElementById('<%=TextBox2.ClientID %>').value == '' )
            {
                error = 1;
            }
            if (document.getElementById('<%=TextBox3.ClientID %>').value == '' )
            {
                error = 1;
            }
          
            if(error == 0)
            {
                if (confirm("Esta seguro que desea grabar?"))
                {
                    return true;
                }
                else
                {
                    return false;                            
                }

            }
            else
            {
                alert('Valide los datos antes de grabar');
                return false;
            }
        } 

Codigo del boton Asp.Net que ejecuta primero la función JavaScript y luego el evento del mismo control Button.
 


Código del lado del servidor que se ejecuta cuando se haya validado todo y el usuario confirme que desea grabar
    protected void Button1_Click(object sender, EventArgs e)
        {
            Literal1.Text = "Datos grabados";
        }







pueden descargar el código de la ejemplo en la siguiente dirección: enlace

lunes, marzo 26, 2012

HAARP: ¿un arma climática?

HAARP ( High Frequency Active Auroral Research Program) o Programa de Investigación de Aurora Activa de Alta Frecuencia es un proyecto que estudia la ionosfera para aplicarlo en la Defensa Militar y mejorar las telecomunicaciones. Surgen diversas controversias en torno a HAARP porque existen teorías que aseguran que cuando se disparan miles de billones de watios a la ionosfera y al rebotar a la tierra estas pueden generar terremotos.


Segun el gobierno Ruso, Estado Unidos esta creando un arma geofísica capaz de alterar el clima y ocasionar desastres naturales.

Les dejo un vídeo que trata sobre este tema.