Configurar Listener para DB Local para evitar error ORA-12514


El error «ORA-12514: TNS:listener does not currently know of service requested in connect descriptor» es bastante genérico, sin embargo, en algunas ocasiones se presenta porque por default el listener no está configurado para atender la BD local por defecto, para solucionar esto, es necesario configurar el listener para que atienda la BD local.

En el archivo listener.ora que se encuentra en [ORACLE_HOME]\NETWORK\ADMIN\listener.ora se debe agregar a la sección SID_LIST_LISTENER una nueva sección SID_DESC como se muestra en el ejemplo:

SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )
  )

Una vez modificado y guardado el archivo, se procede a reiniciar el listener, desde los servicios en el panel de control, o bien con los siguientes comandos en la consola de comandos:

lsnrctl stop
lsnrctl start

 

Errores Webutil en forms 10g R2 con Java 8 JPI


Bueno, para todos los que seguimos usando forms 10g, últimamente se nos está complicando la vida con las actualizaciones de JAVA, somos una especie de foragidos tecnológicos que nos reusamos a seguir el camino de los upgrades, muchas veces super costosos.

Si eres de esos foragidos y necesitas hacer que tu aplicación en forms 10g siga funcionando, acá te dejo unos tips:

  • Verifica siempre la consola de java, para que puedas ver el detalle del error.
  • Después de cada cambio, siempre procura cerrar completamente el browser o navegador de internet y seguidamente borrar el caché JAVA del equipo donde estés realizando las pruebas, antes de repetir las mismas.
  • Si tienes el error «ExceptionInInitializerError: java.security.AccessControlException: access denied (java.util.PropertyPermission java.home read)» Lo que debes hacer es buscar el archivo o fichero java.policy en el directorio donde instalaste el JAVA, en mi caso «C:\Program Files (x86)\Java\jre1.8.0_144\lib\security»

Una vez que lo encontraste, lo abres con un editor de texto y buscas la sección      grant, y agregas la siguiente línea:

permission java.util.PropertyPermission «java.home», «read»;

Este es mi ejemplo del archivo java.policy:

// Standard extensions get all permissions by default

grant codeBase «file:${{java.ext.dirs}}/*» {
permission java.security.AllPermission;
};

// default permissions granted to all domains

grant {
// Allows any thread to stop itself using the java.lang.Thread.stop()
// method that takes no argument.
// Note that this permission is granted by default only to remain
// backwards compatible.
// It is strongly recommended that you either remove this permission
// from this policy file or further restrict it to code sources
// that you specify, because Thread.stop() is potentially unsafe.
// See the API specification of java.lang.Thread.stop() for more
// information.
permission java.lang.RuntimePermission «stopThread»;

// allows anyone to listen on dynamic ports
permission java.net.SocketPermission «localhost:0», «listen»;

// «standard» properies that can be read by anyone

permission java.util.PropertyPermission «java.home», «read»;
permission java.util.PropertyPermission «java.version», «read»;
permission java.util.PropertyPermission «java.vendor», «read»;
permission java.util.PropertyPermission «java.vendor.url», «read»;
permission java.util.PropertyPermission «java.class.version», «read»;
permission java.util.PropertyPermission «os.name», «read»;
permission java.util.PropertyPermission «os.version», «read»;
permission java.util.PropertyPermission «os.arch», «read»;
permission java.util.PropertyPermission «file.separator», «read»;
permission java.util.PropertyPermission «path.separator», «read»;
permission java.util.PropertyPermission «line.separator», «read»;

permission java.util.PropertyPermission «java.specification.version», «read»;
permission java.util.PropertyPermission «java.specification.vendor», «read»;
permission java.util.PropertyPermission «java.specification.name», «read»;

permission java.util.PropertyPermission «java.vm.specification.version», «read»;
permission java.util.PropertyPermission «java.vm.specification.vendor», «read»;
permission java.util.PropertyPermission «java.vm.specification.name», «read»;
permission java.util.PropertyPermission «java.vm.version», «read»;
permission java.util.PropertyPermission «java.vm.vendor», «read»;
permission java.util.PropertyPermission «java.vm.name», «read»;
};

Al otorgar el permiso se debe quitar este error.

  • Busca el archivo o fichero java.security en el directorio donde instalaste el JAVA, en mi caso «C:\Program Files (x86)\Java\jre1.8.0_144\lib\security»

Una vez que lo encontraste, lo abres con un editor de texto y buscas la siguiente línea:

jdk.jar.disabledAlgorithms=MD2, MD5, RSA keySize < 1024

Debes eliminar el texto «MD5,» para que webutil funcione correctamente, debe quedar así:

jdk.jar.disabledAlgorithms=MD2, RSA keySize < 1024

 

  • Si tienes el forms con el último patchset, verifica siempre que estás usando el mismo webutil que viene dentro del patchet, esto aplica tanto con tu equipo de desarrollo donde instalaste forms y reports, como en el servidor de aplicaciones Oracle OAS. Siempre debes procurar que el equipo de desarrollo y el OAS estén con el mismo patchset. Te das cuenta que tienes este problema cuando te aparecen en la consola java los siguientes errores:

oracle.forms.handler.IHandler.getApplet()Ljava/applet/Applet;
at oracle.forms.webutil.common.VBeanCommon.init(VBeanCommon.java:281)

java.lang.ClassNotFoundException: oracle.forms.webutil.clientInfo.GetClientInfo

En mi caso, yo estoy usando el pachset p5983622_10123_WINNT, por lo tanto, debo extraer de este patchset el webutil.2.2. el cual lo encuentras con un programa extractor tipo winrar en la ruta: disk1\stage\patches\oracle.developer.forms.builder\10.1.2.3.0\1\Datafiles\webutil.2.2.jar

 

  • Una vez que determines que tienes el mismo webutil que viene con el patchset, siempre es recomendable firmar el frmwebutil.jar y el jacob.jar con el sign_webutil.bat y dejarlos en la ruta [ORACLE_HOME]\forms\java Esto aplica tanto para el equipo donde desarrollas con oracle forms, como en el servidor donde está instalado OAS.

 

  • Verificar que los archivos o ficheros jacob.jar y frmwebutil.jar están dentro del classpath, tanto del sistema operativo como en los ficheros de configuración .env por ejemplo [ORACLE_HOME]\forms\server\default.env

Oracle OAS 10G en Windows, problemas de Concurrencia.


Después de muchos dolores de cabeza con constantes caídas del OAS, cuando hay demasiada concurrencia, encontré esta solución que espero les sirva:

  1. Se cambia la propiedad del Servicio (Windows Services) que inicia el OAS, se marca el check:  «[x] Allow service to interact with desktop» ó Permitir interactuar con el escritorio.
  2. Modificar en el registro de Windows (Regedit): Se debe navegar a la siguiente ruta: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems

Seleccionar el valor Windows, desde el menú editar, se selecciona String, y se incrementa el parámetro SharedSection. Este parámetro especifica los valores en el siguiente formato:

SharedSection=xxxx,yyyy,zzzz


Los valores por defecto son 1024,3072,512 (Expresados en Kb)

Puede intentar cambiarlos por 1024,20480,5112

Explicación:

xxxx = System-wide Heapsize. (No es necesario modificarlo).

yyyy = IO Desktop Heapsize. Cantidad de memoria para la Pila de los objetos en el Escritorio de IO.

zzzz = Non-IO Destop Heapsize. Cantidad de memoria para los objetos en la pila que noestán en el Escritorio de IO.

Dependiendo si se está ejecutando el OAS como un servicio o bien desde el CMD (Command Line), se debe intentar incrementar el correspondiente parámetro yyyy ó zzzz.

Al cambiar estos parámetros, se deben reiniciar los servidores.

Esto permitió en mi caso tener cerca de 1000 sesiones concurrentes con el OAS.

Saludos,

REP-56048: Engine rwEng-0 crashed al utilizar formato SPREADSHEET


En el archivo de configuración del servidor de reportes [oas_home]\reports\conf\[rep_server].conf  se debe agregar la opción jvmOptions=»-Xmx512M -Xms128M -Xss512k» en la sección de definición de parámetros del engine rwEng

Ejemplo:

<engine id=»rwEng» class=»oracle.reports.engine.EngineImpl» initEngine=»1″ maxEngine=»10″ minEngine=»1″ engLife=»50″ maxIdle=»30″ callbackTimeOut=»90000″ jvmOptions=»-Xmx512M -Xms128M -Xss512k»>

 

Posteriormente se reinicia el reports server y se intenta nuevamente.

 

Saludos,

Base de Datos Oracle 11g Lenta


Recientemente instalé un sistema en una base de datos 11g, el sistema se comportaba bien en la versión 10g, sin embargo en 11g era sumamente lento, el CPU de la base de datos se consumía constantemente al 100%

Investigando, el problema de velocidad se puede deber a varias razones:

Existe un bug en la versión que produce que un job de la base de datos consuma el CPU, para solucionarlo de momento se puede realizar lo siguiente:

1) Detener el servicio dbconsole. (emctl stop dbconsole)

2) Ejecutar los siguientes scripts con un usuario sysdba:

execute SYSMAN.MGMT_PAF_UTL.STOP_DAEMON;

execute SYSMAN.MGMT_PAF_UTL.START_DAEMON;

commit;

3) Volver a levantar el dbconsole. ( emctl start dbconsole)

Si esto no ayuda, otra razón de la lentitud puede ser la nueva característica de Oracle Auto DOP (Oracle’s Automatic Degree of Parallelism).

Esta nueva característica, habilitada por defecto en las instancias de base de datos, intentan que cada query que se ejecute sea ejecutado en Paralelo en todos los CPU, la idea es buena, pero en mi caso no funcionó como esperaba y tuve que deshabilitarlo. Para ello deben cambiar el parámetro parallel_degree-policy=limited

ALTER SYSTEM SET parallel_degree_policy = limited SCOPE=BOTH;

Espero les ayude, Saludos!!

Cálculo de TIR (Tasa Interna de Retorno) con Oracle PL/SQL


Acá les dejo una función que les permite calcular la TIR, he hecho varias pruebas comparando con la misma función en Excel y coincide a la perfección.

 

Qué es la TIR?

http://es.wikipedia.org/wiki/Tasa_interna_de_retorno

Código PL/SQL:

 

— Creación de Tipos de Datos para almacenar en arreglos las fechas y los montos

CREATE OR REPLACE TYPE fo.t_date_array IS VARRAY (200000) OF DATE;

CREATE OR REPLACE TYPE fo.t_amount_array IS VARRAY (200000) OF NUMBER;

— Permite el cálculo de la Tasa Interna de Retorno (TIR)

CREATE OR REPLACE FUNCTION fo.xirr2 (
p_date_array IN t_date_array, –Arreglo donde están almacenadas las fechas
p_amount_array IN t_amount_array, –Arreglo donde están almacenados los montos
p_guess IN NUMBER DEFAULT 0, –Parámetro opcional
p_ctd IN NUMBER DEFAULT 1 –Indica la cantidad de valores que tiene cada arreglo
RETURN NUMBER AS
BEGIN
DECLARE
z NUMBER := 0;
step_limit NUMBER := 0;
temp NUMBER;
step NUMBER := 0.1;
d NUMBER := 0.5;
l_maxdate DATE;
l_mindate DATE;
srok NUMBER;
BEGIN
l_maxdate := p_date_array (1);
l_mindate := p_date_array (1);
FOR i IN 1 .. p_ctd LOOP — FOR i IN 1 .. p_date_array.COUNT LOOP –si se deja de esta manera es posible que reviente error ORA-06533: Subscript beyond count
IF p_date_array (i) > l_maxdate THEN
l_maxdate := p_date_array (i);
END IF;

IF p_date_array (i) < l_mindate THEN
l_mindate := p_date_array (i);
END IF;
END LOOP;

SELECT MONTHS_BETWEEN (l_maxdate, l_mindate)
INTO srok
FROM DUAL;

LOOP
temp := p_amount_array (1);

FOR i IN 2 .. p_ctd LOOP — FOR i IN 2 .. p_amount_array.COUNT LOOP –si se deja de esta manera es posible que reviente error ORA-06533: Subscript beyond count
temp := temp + p_amount_array (i) / POWER ((1 + d), (p_date_array (i) – p_date_array (1)) / 365);
END LOOP;

IF (temp > 0) AND (z = 0) THEN
step := step / 2;
z := 1;
END IF;

IF (temp < 0) AND (z = 1) THEN
step := step / 2;
z := 0;
END IF;

IF (z = 0) THEN
d := d – step;
ELSE
d := d + step;
END IF;

step_limit := step_limit + 1;
EXIT WHEN ((ROUND (temp * 100000) = 0) OR (step_limit = 10000));
END LOOP;

RETURN d;
END;
END xirr2;

–Probar la función con el siguiente código:

DECLARE
p_date_array fo.t_date_array;
p_amount_array fo.t_amount_array;
p_guess NUMBER;
p_ctd NUMBER;
v_return NUMBER;
BEGIN
— Cantidad de valores en los arreglos:
p_ctd := 5;
— Arreglo de fechas
p_date_array :=
fo.t_date_array (TO_DATE (‘01.01.2008’, ‘dd.mm.yyyy’),
TO_DATE (‘01.03.2008’, ‘dd.mm.yyyy’),
TO_DATE (‘30.10.2008’, ‘dd.mm.yyyy’),
TO_DATE (‘15.02.2009’, ‘dd.mm.yyyy’),
TO_DATE (‘01.04.2009’, ‘dd.mm.yyyy’)
);
— Arreglo de los montos
p_amount_array := fo.t_amount_array (-10000, 2750, 4250, 3250, 2750);
p_guess := NULL;
v_return := fo.xirr2 (p_date_array => p_date_array, p_amount_array => p_amount_array, p_guess => p_guess, p_ctd => p_ctd);
DBMS_OUTPUT.put_line (‘v_Return = ‘ || v_return);
END;

 ————————————————————————-

Saludos!!

Gabriel

Nuevo esquema de Seguridad en Base de Datos Oracle 11g


Para los que todavía no han instalado la base de datos Oracle 11g, esta información les puede ayudar a ahorrarse varias horas de investigación:

 

Ahora no basta con que un usuario sea dba para poder tener las funciones de un dba, esto porque ahora los roles tienen un status de encendido/apagado on/off, y por defecto los roles de los usuarios están en estado apagado.

 

Cada usuario tiene una lista de roles por defecto o DEFAULT ROLES, todos los roles que se encuentren en esta lista estarán por defecto encendidos cuando el usuario inicie sesión:

 

ALTER USER MYUSER DEFAULT ROLE ROL1, DBA, ROLX

/

Esto no implica que el usuario no deba tener el grant, es decir, primero el usuario debe tener el grant de un rol para luego poder agregarlo a su lista de ROLES DEFAULT.

 

Si por seguridad se desea que un usuario tenga un rol, pero que no esté encendido por defecto, y que el usuario lo encienda a discreción, la instrucción es tan simple como

SET ROLE MYROL

/

Por ejemplo:

Set role dba

/

Espero que les sirva,

 

Saludos,

Gabriel

Problemas con Oracle Debugger …


Últimamente me ha estado pasando que he tratado de debuggear código PL/SQL de la base de datos, y el Debugger se queda congelado, (freeze), por curiosidad lo he dejado esperando hasta que reaccione, y lo hace, pero tarda muchísimo en responder, con lo que la depuracion ya no es funcional.

Yo por lo general uso Toad para debuggear pero he leído en internet y mucha gente tiene el mismo problema, ya que parece que el problema es interno en la comunicación con la base de datos Oracle y no con la herramienta que uses para debuggear.

Si me conecto a monitorear la sesion, encuentro que la misma se queda haciendo WAITS indefinidamente, específicamente hace WAITS leyendo PIPES, tal parece que falla la comunicación entre la sesión de debug y la sesiona que ejecuta el Stored Procedure ya que el mecanismo que usa Oracle para debugear es hacer varias sesiones.

Alternativa o Solución Temporal

En mi caso que utilizo TOAD para depurar, si me voy a opciones, el mismo me presenta la opción de seleccionar el debugger JDWP, basado en JAVA, sin embargo me solicita dos parámetros: un HOST, y un PUERTO.

Si en la maquina que desarrollas tienes instalado un cliente de oracle superior a 9, entonces, en el HOST puedes poner tu propia PC como Servidor del Debugger, y el parámetro PORT lo puedes dejar en «Use any available», eso si verifica que tu FIREWALL no te bloquee el puerto para que no tengas problemas. También le marque el check que dice «Allow stepping into Java Source».

Si alguien tiene idea de como solucionar el tema del PIPE WAIT sus comentarios serán bien recibidos.

 

Saludos,

Gabriel Garcia

 

Oracle forms en Java 7, frm-92095-oracle-jnitiator-version-too-low


Al actualizar java de la versión 6 a la versión 7 (1.7.xxx) parece que el forms se confunde y no quiere funcionar, mostrando este error: «frm-92095-oracle-jnitiator-version-too-low-please-install-version-1-1-8-2-or-higher» o bien, en español: «Frm-92095 Oracle Jinitiator versión demasiado baja – por favor instale la versión 1.1.8.2 o superior» para no quedarnos sin las aplicaciones en forms, tenemos dos opciones, podemos desinstalar java 7 y volver a java 6 lo cual no es muy recomendable debido a los problemas de seguridad que esto conlleva.

Según esta página: http://www.ora600.be/FRM-92095%3A+Oracle+Jnitiator+version+too+low+-+please+install+version+1.1.8.2+or+higher el problema se debe a que después de que Oracle compro Sun, las versiones nuevas de JAVA han cambiado el nombre del distribuidor, por ejemplo:

En java 1.6:
java.version =1.6.0_30
java.vendor =Sun Microsystems Inc.
En java 1.7:
java.version =1.7.0_02
java.vendor =Oracle Corporation

De manera que la solución sería engañar al forms y hacerle creer que en el nuevo JAVA 7, el distribuidor continúa siendo Sun Microsystems, esto lo logramos de la siguiente manera:

1) En Windows, abrimos el Panel de Control y buscamos el ícono de JAVA y damos doble click.

2.1) Buscamos en el panel de control las propiedades de sistema y agregamos la variable de ambiente _JAVA_OPTIONS con el valor -Djava.vendor=»Sun Microsystems Inc.» y aceptamos el cambio.

Untitled

2) En el panel de control buscamos y presionamos la cejilla o pestaña con la etiqueta «Java».

3) Presionamos el botón con la etiqueta «View».

4) Aparece una nueva pantalla con todas las versiones JAVA que tenemos instalados, ordenados descendentemente.

5) Si no aparece la versión java 1.7 entonces salimos de la ventana y debemos ejecutar el panel de control de java directamente desde esta ruta y repetimos los pasos:

«C:\Program Files (x86)\Java\jre7\bin\javacpl.exe»

6) En la pantalla del panel de control de Java, En la versión 1.7 buscamos la columna «Runtime Parameters» y agregamos la siguiente línea: -Djava.vendor=»Sun Microsystems Inc.»  esto lo hacemos tanto en la cejilla User y en la cejilla System. y aceptamos la modificación.Untitled

7) Reiniciamos todos los Navegadores o Browser y cualquier otro programa que esté usando JAVA para que el cambio surta efecto.

Con esto logramos correr nuestros programas en forms con la última versión de JAVA, lo malo es que hay que repetir este procedimiento con cada actualización de JAVA, porque el cambio se pierde.

 

Muchos Éxitos.

Diferencias entre Oracle y MS SQL Server


Me encontré este enlace muy interesante para quienes quieran aprender y dominar ambos productos…

http://www.bristle.com/Tips/SQL.htm