domingo, 7 de diciembre de 2014

Buscar una tabla por el valor en una de sus columnas

Puede darse el caso que deseemos encontrar el nombre de una tabla de la cual solo sabemos un valor específico para un registro y columna. Esta búsqueda puede ser muy pesada para la base de datos si existen muchas tablas o registros en ella, así que debemos intentar indicar el mayor número de condiciones posibles.

En el siguiente trozo de PL/SQL seleccionamos en una primera consulta todas las tablas y columnas donde podría encontrarse el literal que buscamos. Filtramos por el esquema al que estamos conectados (USER) o el que deseemos, tipo de dato de la columna o una longitud mínima, calculada con el literal de mayor longitud que hemos podido encontrar. Sin embargo para el literal a comparar recomendamos que sea lo más corto posible a fin de aligerar la operación de comparación.

Posteriormente en un bucle, para cada columna y tabla encontrada, se realiza una búsqueda para encontrar un registro que cumpla con nuestro literal.
set serveroutput on;

DECLARE
  match_count integer;
  v_search_string varchar2(100) := 'Civilization... solo un turno más';
BEGIN  
  FOR t IN (SELECT owner, table_name, column_name 
              FROM all_tab_columns 
              WHERE owner = USER and DATA_TYPE = 'VARCHAR2' and DATA_LENGTH >= 37
            ) LOOP   
    EXECUTE IMMEDIATE    
      'SELECT COUNT(*) FROM '||t.owner || '.' || t.table_name||
      ' WHERE '||t.column_name||' = :1'   
      INTO match_count  
      USING v_search_string; 
      
    IF match_count > 0 THEN 
      dbms_output.put_line( t.owner || '.' || t.table_name ||' '||t.column_name||' '||match_count );
    END IF; 
    
  END LOOP;
  
  dbms_output.put_line('Fin');
END;
/

miércoles, 26 de noviembre de 2014

Ordenar lista creando comparador

Ordenación de una lista creando un comparador específico para la ordenación.
List listResult;

[...]

// Sorting the result list by campo1.id
Collections.sort(listResult, new Comparator() {
 @Override
 public int compare(final TipoDto object1, final TipoDto object2) {
  return object1.getCampo1().getId().compareTo(object2.getCampo1().getId());
 }
});

viernes, 7 de noviembre de 2014

Leer Properties externo

Ejemplo de como podemos leer un fichero .properties ubicado fuera de nuestro proyecto Java.
package configuration;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Locale;
import java.util.ResourceBundle;

public class ConfigurationLoader {
 
 private static final String MAGPIES = "magpies";
 private static final String PATH= "path";
 
 public Configuration loadConfiguration() throws IOException {
  final ResourceBundle rb = getResourceBundle();  
  final Configuration config = new Configuration();
  config.setMagpies(Integer.valueOf(rb.getString(MAGPIES)));
  config.setPath(rb.getString(PATH));  
  return config;
 }
 
 private ResourceBundle getResourceBundle() throws IOException {
  final URL[] urls = {new File(".").toURI().toURL()};
  final ClassLoader loader = new URLClassLoader(urls);
  return ResourceBundle.getBundle("general", Locale.getDefault(), loader);   
 }
}
Una vez generado el jar ejecutable, el fichero de propiedades se podría situar en la misma carpeta.

jueves, 24 de julio de 2014

SQL Developer

Configuración para facilitar el uso de SQL Developer.

· Mostrar resultados en nuevas pestañas. Hay una opción para que cada vez que se ejecuta una consulta, el resultado se muestre en una pestaña nueva sin machacar las existentes. Equivale a tener el botón de la chicheta roja pulsado o despulsado por defecto. Esta opción se edita en Herramientas → Preferencias → Base de Datos → Hoja de Trabajo → Mostrar resultados de consulta en separadores nuevos.

· Poner el entorno en UTF-8 en Herramientas → Preferencias → Entorno → Codificación.

· Abrir PL/SQL en modo lectura. Para evitar modificar los PL/SQL accidentalmente desde el editor, marcar la siguiente opcion: Herramientas → Preferencias → Editor de Codigos → Iniciar en Modo de Sólo Lectura.

· Mostrar constraints y otros esquemas. Ir a Herramientas → Preferencias → Base de Datos → Extensiones Definidas por el Usuario e incluir los ficheros tablespace_editor.xml, tablespace_nav.xml, constraints_editor.xml, y constraints_nav.xml (adjuntos en esta pagina), como tipo EDITOR o NAVIGATOR según el fichero sea *editor.xml o *nav.xml. Si aún están los ficheros por defecto de SQLDeveloper podemos eliminarlos.

· Refrescar manualmente una vista materializada. Ir a Herramientas → Preferencias → Base de Datos → Extensiones Definidas por el Usuario e incluir el fichero materialized_view_refresh.xml como tipo ACTION. Cerrar el SQLDeveloper y cuando se vuelva a abrir, en las vistas materializadas aparece una nueva opción llamada "Fast Manual Refresh" que refrescará la vista.

· Mostrar tablas hijas de una tabla. Ir a Herramientas → Preferencias → Base de Datos → Extensiones Definidas por el Usuario e incluir el fichero tablas_hijas_editor.xml como tipo EDITOR. Cerrar SQLDeveloper para ver la nueva pestaña a la hora de ver los datos de una tabla.

· Hoja de trabajo compartida o no compartida. Una hoja de trabajo compartida permite cambiar el esquema sobre el que trabaja, sin afectar al código escrito. Una hoja de trabajo no compartida tiene un esquema fijo, protegiendo para que no se ejecute accidentalmente en el esquema incorrecto. Para configurar que por defecto las hojas de trabajo nuevas sean compartidas o no, ir a Herramientas → Preferencias → Base de Datos → Hoja de Trabajo. Habilitar o deshabilitar la opción "Nueva hoja de trabajo para utilizar conexiones no compartidas".

· Visor de objetos (explorador lateral). Para configurar ir a Herramientas → Preferencias → Base de Datos → Visor de Objetos. La opción activada "Congelar Automáticamente Ventanas del Visor de Objetos" nos permitirá tener varios objetos abiertos y no sobreescribir el anterior al abrir uno nuevo (ejemplo queremos tener dos tablas abiertas). La opción desactivada "Abrir Objeto con un solo clic" nos obliga a hacer doble click en un objeto para abrirlo. Así podremos hacer un único click para copiar su nombre, ver sus opciones o consultar sus columnas, sin tener que abrirlo con el retraso y molestia que conlleva.

constraints_editos.xml
constraints_nav.xml
materialized_view_refresh.xml
tablas_hijas_editor.xml
tablespace_editor.xml
tablespace_nav.xml