Mostrando las entradas con la etiqueta Oracle. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Oracle. Mostrar todas las entradas

jueves, 19 de mayo de 2016

Descifrar una clave de WebLogic

Realizar los siguientes pasos en el WebLogic Scripting Tool (wlst.cmd ó wlst.bash):

domain = C:\\bea\\user_projects\\domains\\base_domain
service = weblogic.security.internal.SerializedSystemIni.getEncryptionService(domain)
encryption = weblogic.security.internal.encryption.ClearOrEncryptedService(service)
print encryption.decrypt("{3DES}5pLoc3OzmAiQ8MyEZBJTkw==")

Visto en: Justin's Blog

miércoles, 14 de enero de 2015

Iterar objetos de un tipo tabla

DECLARE
  v_Return TRANSACCION_TBL;
BEGIN
  v_Return := PKG.GET_TRANSACCIONES();
  
  FOR counter IN v_Return.first .. v_Return.last
  LOOP
    DBMS_OUTPUT.PUT_LINE('ID: '||v_Return(counter).id_transaccion);
    DBMS_OUTPUT.PUT_LINE('NOMBRE: '||v_Return(counter).nombre);
  END LOOP;
END;

viernes, 10 de octubre de 2014

Recuperación de transacciones Oracle en WebSphere (AS) 8.5

En el momento de iniciar el servidor de aplicaciones después de una caída, éste intenta recuperar las transacciones de base de datos correspondientes a data sources XA. Con una base de datos Oracle en ocasiones se presenta la siguiente excepción:
0000048 XARminst E WTRN0037W: The transaction service encountered an error on an xa_recover operation. The resource was com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl@e0881a27. The error code was XAER_RMERR. The exception stack trace follows: javax.transaction.xa.XAException at oracle.jdbc.xa.OracleXAResource.recover(OracleXAResource.java:709) at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.recover(WSRdbXaResourceImpl.java:1116) at com.ibm.ws.Transaction.JTA.XARminst.recover(XARminst.java:141) at com.ibm.ws.Transaction.JTA.XARecoveryData.recover(XARecoveryData.java:716) at com.ibm.tx.jta.impl.PartnerLogTable.recover(PartnerLogTable.java:431) at com.ibm.tx.jta.impl.RecoveryManager.resync(RecoveryManager.java:1534) at com.ibm.tx.jta.impl.RecoveryManager.performResync(RecoveryManager.java:2267) at com.ibm.ws.tx.jta.RecoveryManager.performResync(RecoveryManager.java:117) at com.ibm.tx.jta.impl.RecoveryManager.run(RecoveryManager.java:2220) at java.lang.Thread.run(Thread.java:773)

El problema se debe a que el usuario de base de datos que estamos usando no tiene permisos para recuperar transacciones, lo que se solucciona ejecutando lo siguiente:
grant select on pending_trans$ to <user>;
grant select on dba_2pc_pending to <user>;
grant select on dba_pending_transactions to <user>;
grant execute on dbms_system to <user>;
Si la versión de Oracle es mayor a la 10.2.0.4, se debe remplazar el último privilegio por:
grant execute on dbms_xa to <user>;
Otra manera de solucionarlo, en caso de que no sea importante recuperar las transacciones (por ejemplo en un ambiente de desarrollo), es borrando el contendio del directorio <WebSphere Application Server_install_root>\profiles\<PROFILE_NAME>\tranlog\<CELL_NAME>\<NODE_NAME>\<SERVER_NAME>\transaction antes de iniciar el Application Server.
Visto en www-01.ibm.com

lunes, 23 de agosto de 2010

Oracle: Cómo encontrar las tablas hijas de una tabla

Con el siguiente script se pueden encontrar las tablas hijas para determinada tabla:
select table_name as hijas
from user_constraints
where r_constraint_name in (select constraint_name
from user_constraints
where table_name=upper('&table_name')
and constraint_type='P')
order by table_name;

Visto en Foros de Oracle

jueves, 3 de diciembre de 2009

Cómo ejecutar un archivo sql desde SQL Plus

Para ejecutar un archivo sql desde SQL Plus se pasa como comando la ruta del archivo precedida de un símbolo de arroba(@). Ejemplo:

SQL> @C:\scripts\InsertsBD.sql

martes, 11 de agosto de 2009

Sentencias en Oracle con ampersand

Cuando se va a hacer un insert o update en SQL*Plus que contenga el símbolo ampersand (&), se pueden obtener resultados que no esperamos.
INSERT INTO empresa values('A & B')
SQL*Plus intentará resolver lo que haya después del ampersand como si se tratara de una variable.
Hay dos maneras para poder realizar correctamente el insert:

Opción 1:
SET DEFINE OFF
INSERT INTO empresa values('A & B')
Opción 2:
INSERT INTO empresa values('A &'||' B')
En la segunda opción cada ampersand que vayamos a insertar debe quedar al final de una cadena y luego concatenamos el resto de lo que queremos insertar.

martes, 9 de junio de 2009

Oracle Functions Decode y Sign

Estas funciones son bastante útiles cuando se necesita seleccionar un valor u otro dependiendo de cierta condición.
La función Decode trabaja como un IF-THEN-ELSE o como un IF-THEN-ELSEIF-ELSEIF-...-ELSE. Su sintaxis es:
decode( expression , search , result [, search , result]... [, default] )
En los parámetros, expression es el valor que queremos comparar y cada par search-result, funciona como un if, es decir, IF search THEN result. Mejor escribo un ejemplo:
SELECT decode( codigo_empresa, 100, 'Yahoo!', 200, 'Google', 300, 'Sun') FROM empresa;
Esto es como si hicieramos algo como:
if ( codigo_empresa == 100 ){
  echo 'Yahoo!';
}
else if( codigo_empresa == 200 ) {
  echo 'Google';
}
else if( codigo_empresa == 300 ) {
  echo 'Sun';
}
La función Sign nos devuelve un valor para indicar si un número es positivo, negativo o cero (0). Ejemplos:
SELECT sign(-5) from dual;   -- Devuelve -1
SELECT sign(1000) from dual;   -- Devuelve 1
SELECT sign(0) from dual;   -- Devuelve 0
SELECT sign(0.0001) from dual;   -- Devuelve 1
Ahora, cómo usar juntas estas funciones para obtener un gran provecho? Supongamos que tenemos dos tablas con estructuras similares, donde manejamos unos valores para diario, semanal y mensual. En una de las tablas manejamos los detalles y en la otra manejamos los "topes" máximos que se van a obtener al consultar.
SELECT
decode( sign( det.diario - tope.diario ), -1, det.diario, 0, det.diario, tope.diario ) AS diario
decode( sign( det.semanal - tope.semanal ), -1, det.semanal, 0, det.semanal, tope.semanal ) AS semanal
decode( sign( det.mensual - tope.mensual ), -1, det.mensual, 0, det.mensual, tope.mensual ) AS mensual
FROM detalle det, tope;
Este query nos va a traer el valor más bajo de las columnas diario, semanal y mensual entre la tabla Detalle y la tabla Tope.

martes, 16 de diciembre de 2008

ORA-00942 La tabla o vista no existe (pero sí existe)

Este error nos ha salido a muchos y generalmente se presenta cuando realmente la tabla o vista no existe en el esquema en el que la queremos usar.

Pero otras veces se genera porque no se han dado los permisos necesarios hacia la tabla o vista, o porque estamos intentando referenciar la tabla sin su esquema (cuando pertenece a otro) y el motor de base de datos se confunde si hay otro objeto en la base de datos con el mismo nombre.

Sin embargo, aunque la tabla exista y aunque se tengan los permisos necesarios para acceder a ella y se use el nombre del esquema al que pertenece, todavía existe la posibilidad de que nos salga el error ORA-00942. Resulta que si los permisos sobre la tabla o vista son concedidos a un rol al que pertenece el usuario con el que necesitamos accederla, es posible ejecutar query's normalmente. Pero si estos query's se van a ejecutar dentro de un procedimiento almacenado, nos vamos a encontrar con ORA-00942.

Qué pasa?
Pues no sé si sea un bug en el RDBMS, o esa sea su forma de administrar los privilegios o tal vez es por razones de seguridad, pero para poder acceder a una tabla o vista desde un procedimiento almacenado, el usuario debe haber adquirido los privilegios directamente y no a través de un rol.

miércoles, 24 de septiembre de 2008

Cómo incrementar el valor de una secuencia

El siguiente PL/SQL es útil para incrementar el valor de una secuencia al valor que deseemos:
DECLARE
i NUMBER(10);

BEGIN

  SELECT SQCUENTA.NEXTVAL INTO i FROM dual;

  WHILE i < 1000000 LOOP 
    SELECT SQCUENTA.NEXTVAL INTO i FROM dual; 
  END LOOP;
END;
Esto me ha funcionado en una BD Oracle 10g.

En PostgreSQL existe la función setval que permite hacer lo mismo.
SELECT setval('SQCUENTA', 1000000);