Función LISTAGG en 11gr2 : Para concatenar valores en una sola columna



El típico problema al que todos nos hemos enfrentado, sacamos un listado de valores, pero lo que necesitamos es concatenarlos hacia el lado , en una sola fila ..


Obs : Se nota como piensa la señorita....¿cierto?

Por ejemplo :

select ciudad from pais where nombre='Chile';

CIUDAD
------
Arica
La Serena
Valparaíso
Santiago

Pero lo que queremos es la siguiente salida

CIUDAD
------
Arica;La Serena;Valparaíso;Santiago

Para resultados pequeños , esto es muy fácil, pero ¿si fueran miles? :'(

Esto lo resolvemos quizás con un Pl/SQL , con un cursor que concatene los valores en un string mayor, llevando los valores a una planilla Excel y concatenando, etc, etc, etc.

Pues bien, esto a partir de 11gr2 es sumamente sencillo, con una función muy poderosa llamada LISTAGG.

He acá unos pequeños ejemplos :

- Tomamos un listado de los datafiles disponibles

SQL> select file_name from dba_data_files;

FILE_NAME
-----------------------------------------------
C:\APP\LIGARIUS\ORADATA\PROD12C\SYSTEM01.DBF
C:\APP\LIGARIUS\ORADATA\PROD12C\SYSAUX01.DBF
C:\APP\LIGARIUS\ORADATA\PROD12C\UNDOTBS01.DBF
C:\APP\LIGARIUS\ORADATA\PROD12C\USERS01.DBF
C:\APP\LIGARIUS\ORADATA\PROD12C\USERS02.DBF
C:\APP\LIGARIUS\ORADATA\PROD12C\SYSTEM02.DBF


Como podemos apreciar , los datos aparecen listados de forma normal.


Para que aparezcan hacía la derecha, concatenados por algún carácter se ejecuta una función analítica llamada LISTAGG

1 select listagg(file_name,';')
2 within group (order by file_id)
3* from dba_data_files

LISTAGG(FILE_NAME,';')WITHINGROUP(ORDERBYFILE_ID)
----------------------------------------------------------------------------------------------------
C:\APP\LIGARIUS\ORADATA\PROD12C\SYSTEM01.DBF;C:\APP\LIGARIUS\ORADATA\PROD12C\USERS02.DBF;C:\APP\LIGA
RIUS\ORADATA\PROD12C\SYSAUX01.DBF;C:\APP\LIGARIUS\ORADATA\PROD12C\SYSTEM02.DBF;C:\APP\LIGARIUS\ORADA
TA\PROD12C\UNDOTBS01.DBF;C:\APP\LIGARIUS\ORADATA\PROD12C\USERS01.DBF


listagg(file_name,';') : Le indicamos que columna queremos concatenar y el carácter de concatenación.
within group (order by file_id) : En esta claúsula le indicamos como ordenar las salidas a concatenar

En este ejemplo concatenamos los datafiles de cada uno de los tablespaces existentes

1 select tablespace_name , listagg(file_name,';')
2 within group (order by file_id) datos
3 from dba_data_files
4 group by tablespace_name
5* order by tablespace_name

TABLESPACE_NAME DATOS
--------------- -----------------------------------------------------------------------------------------
SYSAUX C:\APP\LIGARIUS\ORADATA\PROD12C\SYSAUX01.DBF
SYSTEM C:\APP\LIGARIUS\ORADATA\PROD12C\SYSTEM01.DBF;C:\APP\LIGARIUS\ORADATA\PROD12C\SYSTEM02.DBF
UNDOTBS1 C:\APP\LIGARIUS\ORADATA\PROD12C\UNDOTBS01.DBF
USERS C:\APP\LIGARIUS\ORADATA\PROD12C\USERS02.DBF;C:\APP\LIGARIUS\ORADATA\PROD12C\USERS01.DBF


Una excelente función :>>

La documentación oficial
http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions089.htm#SQLRF30030


by Ligarius
14.08.14. 20:11:11. 466 words, 5499 views. Categories: Base de datos ,

Oracle Golden Gate : Dejando el manager como servicio Windows



¿Qué sucede si nuestro proceso Manager de Oracle Golden Gate no queda en modo Background? Pues simplemente cada vez que salgamos de la sesión, el proceso se bajará y ya no tendremos acceso a la extracción ni replicación.

Para dar una idea en general , el proceso Oracle Golden Manager es el que maneja la replicación mediante los procesos REPLICAT y maneja la extracción mediante los procesos EXTRACT, cada uno de estos ocupa un puerto que es asignado por el mismo manager

Puedes ver un pequeño ejemplo de como instalar Oracle Golden Gate en el siguiente link
http://www.oracleyyo.com/index.php/2011/03/08/uso_golden_gate

Puedes analizar la documentación de Oracle Golden Gate
http://www.oracle.com/technetwork/middleware/goldengate/documentation/index.html



He aquí el efecto de no tener el Oracle Golden Gate Manager en modo background.

Primero chequeamos el estado de nuestro Oracle Golden Gate Manager, el cual aparece como DOWN



Posterior a esto, levantamos el servicio y vemos como aparece una pantalla de RUNTIME (Ya no está ejecutándose como servicio Windows)


Si cerramos la sesión de Windows , nuestro servicio de manager se caerá :'(

Para poder solucionar esto, vamos a la carpeta de instalación del Golden Gate y ejecutamos el comando install, esto realiza una creación de servicio en Windows

Para ello realizamos la siguiente ejecución

install addevents addservice autostart

ADDEVENTS : Significa que se añade el nuevo servicio al Event Manager
ADDSERVICE : Es el nombre del servicio , por defecto se nombrará como GGSMGR.
AUTOSTART : Para que el servicio levante de forma automática, sin necesidad de intervención , por ejemplo en un reboot de la máquina


La cual aparece consignada en el siguiente documento (2.7.4 Installing Manager as a Windows service)
http://docs.oracle.com/cd/E35209_01/doc.1121/e35957.pdf

Ya con los comandos anteriores, tenemos nuestro servicio Windows asociado al Oracle Golden Gate Manager, si está como servicio , no depende de nuestra sesión para seguir viviendo.

by Ligarius
08.08.14. 13:40:25. 334 words, 3477 views. Categories: Oracle Golden Gate ,

Oracle Golden Gate : Como aplicar un parche



La pregunta es simple , ¿cómo aplicar un parche sobre Oracle Golden Gate? , créanme que es más fácil de lo que se lee.



Primero debemos saber que versión y tipo de Golden Gate poseemos , para ello simplemente nos conectamos a la consola de trabajo mediante el comando ggsci



Allí podemos ver la versión que poseemos, para nuestro caso vemos que poseemos la versión 11.2.1.0.0 para Golden Gate for Microsoft SQL


Buscamos el parche disponible en metalink , para ello vamos a la búsqueda de parches y seleccionamos PRODUCT or FAMILY e indicamos el producto, el release a instalar (parche en sí) y la plataforma (Sistema Operativo)


Una vez realizada la búsqueda, se nos muestra los parches disponibles




El parche a bajar es el 19033886

Una vez bajado el parche, lo único que debemos hacer es descomprimir el parche dentro de la carpeta llamada ggs, que fue donde instalamos Oracle Golden Gate, no se pierde ninguna configuración, ningún replicador ni extractor...

Cuando consultemos nuestra nueva versión aparecerá el número del parche




Y eso es todo , quedamos con una versión 11.2.1.0.24 :P muy sencillo ¿cierto?



by Ligarius
03.08.14. 18:29:33. 192 words, 3801 views. Categories: Oracle Exadata ,

Tips sobre discos ASM y como buscar su correspondiente dispositivo en Linux



Un amigo :) , me envío este pequeño tip y la verdad lo encontré muy bueno, es simplemente para buscar el dispositivo físico y su asociación con las etiquetas de ASM ..



Tiempo atrás publiqué una pequeña nota de lo potente de la vista v$asm_disk , en donde se podían ver incluso los discos que eran candidatos para colocar en los distintos diskgroups

http://www.oracleyyo.com/index.php/2011/09/22/vista_vasm_disk


Pero a través de esta consulta no se podía ver el dispositivo asociado al disco de ASM, pues he aquí el tips..

Por ejemplo hacemos la consulta en la v$asm_disk
GROUP_NUMBER DISK_NUMBER HEADER_STATU STATE      TOTAL_MB    FREE_MB NAME                 PATH
------------ ----------- ------------ -------- ---------- ---------- -------------------- ------------------------------
          1           0 MEMBER       NORMAL       204797       8609 DAT0000            /dev/oracleasm/disks/DAT_01
          1           1 MEMBER       NORMAL       204797       8608 DAT0001            /dev/oracleasm/disks/DAT_02
          1           2 MEMBER       NORMAL       204797       8612 DAT0002



Y vemos que aparece un /dev/oracleasm/disks/DAT_02 , chequeamos esto con los discos que estén configurados con el ASMLib.



Con el usuario root , ejecutamos la siguiente consulta

[root@~]# oracleasm querydisk -d DAT_02



Esta consulta nos dará el siguiente resultado

Disk "DAT_02" is a valid ASM disk on device [19, 49]



Para poder buscar el dispositivo asociado, ejecutamos la siguiente consulta

[root@~]# ls -l /dev/* | grep '19,'| grep 49



Y el resultado será

brw-r----- 1 root disk 8, 49 Jun 10 05:09 /dev/sdf1



Ese es el dispositivo asociado a disco de asm DAT_02

Bastante útil ...

Muchas gracias a mi seudo amigo Juan Díaz , DBA polifuncional de Directv en Santiago de Chile :>>



by Ligarius
21.07.14. 14:54:03. 256 words, 4362 views. Categories: ASM (Automatic Storage Management) ,

Problemas instalando Oracle 10.2.0.5 64 bits en Linux on Power (RHEL 5.9)



La verdad esto no es una receta de cocina, ni tampoco es un "Best Practices", es simplemente mostrar algunos problemitas para poder instalar un motor Oracle 10gr2 sobre el bendito Linux de las máquinas AIX (ojalá no les suceda) :no:





El detalle de lo efectuado :

Problema 1 : Descarga de los instaladores Oracle |-|

Los instaladores se descargan mediante un SR a Oracle dado que no están disponibles los medios para Oracle10gr2 pues están sin soporte (a no ser que se contrate un soporte extendido, pero de todas formas no están para descarga de usuarios comunes)
Para poder crear un SR, necesitas una cuenta de Metalink y generar un SR en el siguiente apartado.


Lo bueno de todo es que ya los tengo y que puedes descargarlos mediante siguiente URL
http://www.oracleyyo.com/index.php/2014/01/15/links_descarga_oracle


Problema 2 : Ejecución del instalador de Oracle
Una vez copiados los medios comenzó la instalación , el problema es que la versión 10.2.0.1 no está soportada para instalarla en un Red Hat Linux 5.9 on Power y eso me lo demostró con un pequeño error


Checking operating system version: must be redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2
Failed

Para solucionar lo anterior simplemente ejecutamos el runInstaller ignorando los prerequisitos, puesto que la versión 10.2.0.1 para Linux on Power no está certificada para RHEL 5.9 , pero si está certificada la versión 10.2.0.5 :))

./runInstaller -ignoreSysPrereqs



Problema 3 : Problemas con los instaladores de Java
Con lo anterior continuamos con la instalación, y apareció otro problemilla |-|

La versión de Java instalada no correspondía con lo necesitado, por ende arrojaba un error

Checking operating system version: must be redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2
Failed <<<<

>>> Ignoring required pre-requisite failures. Continuing...

Preparing to launch Oracle Universal Installer from /tmp/OraInstall2014-05-12_04-06-27PM. Please wait ...[oracle@colbun1 database]$ Oracle Universal Installer, Version 10.2.0.1.0 Production
Copyright (C) 1999, 2005, Oracle. All rights reserved.

Exception java.lang.ExceptionInInitializerError occurred..
java.lang.ExceptionInInitializerError
at java.awt.Component.(Component.java:548) at oracle.sysman.oii.oiif.oiifm.OiifmGraphicInterfaceManager.(OiifmGraphicInterfaceManager.java:222) at oracle.sysman.oii.oiic.OiicSessionInterfaceManager.createInterfaceManager(OiicSessionInterfaceManager.java:193) at oracle.sysman.oii.oiic.OiicSessionInterfaceManager.getInterfaceManager(OiicSessionInterfaceManager.java:202) at oracle.sysman.oii.oiic.OiicInstaller.getInterfaceManager(OiicInstaller.java:436) at oracle.sysman.oii.oiic.OiicInstaller.runInstaller(OiicInstaller.java:926) at oracle.sysman.oii.oiic.OiicInstaller.main(OiicInstaller.java:866) Caused by: java.lang.NullPointerException at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2159) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1994) at java.lang.Runtime.loadLibrary0(Runtime.java:824) at java.lang.System.loadLibrary(System.java:908) at sun.security.action.LoadLibraryAction.run(LoadLibraryAction.java:76) at java.security.AccessController.doPrivileged1(Native Method) at java.security.AccessController.doPrivileged(AccessController.java:287) at sun.awt.NativeLibLoader.loadLibraries(NativeLibLoader.java:81) at sun.awt.DebugHelper.(DebugHelper.java:56) ... 7 more Exception in thread "main" java.lang.NoClassDefFoundError: oracle/sysman/oii/oiif/oiifm/OiifmMainFrame at oracle.sysman.oii.oiif.oiifm.OiifmGraphicInterfaceManager.(OiifmGraphicInterfaceManager.java:222) at oracle.sysman.oii.oiic.OiicSessionInterfaceManager.createInterfaceManager(OiicSessionInterfaceManager.java:193) at oracle.sysman.oii.oiic.OiicSessionInterfaceManager.getInterfaceManager(OiicSessionInterfaceManager.java:202) at oracle.sysman.oii.oiif.oiifm.OiifmAlert.(OiifmAlert.java:151) at oracle.sysman.oii.oiic.OiicInstaller.runInstaller(OiicInstaller.java:984) at oracle.sysman.oii.oiic.OiicInstaller.main(OiicInstaller.java:866)


s faltantes
IBM Java 1.4.2 64-bit (SR1a) or higher.
IBMJava2-142-ppc64-SDK-1.4.2-1.0
IBM Java 1.4.2 32-bit (SR1a) or higher.
IBMJava2-142-ppc32-SDK-1.4.2-1.0

Esto aparece en una nota de Oracle Metalink
IBM Power ./runinstaller Errors with "Exception java.lang.ExceptionInInitializerError occurred.." (Doc ID 780889.1)


Problema 4 : Problema con el precompilador XLC para IBM
Oracle 10.2.0.1 para Linux on POWER, ocupa al momento de su instalación unos precompiladores para generar algunos ejecutables que van en el $ORACLE_HOME/bin, estos precompiladores de C son especiales para Linux sobre máquinas con arquitectura P Series (IBM).


El error que aparecía con el instalador era el siguiente


Lo anterior se debía solucionar instalando la versión requerida para el Sistema Operativo y el motor a instalar, esta versión era la VAC 9

http://www-306.ibm.com/software/awdtools/xlcpp/features/linux/xlcpp-linux.html

XL C/C++ Advanced Edition for Linux, V9.0 offers the following new enhancements over its V8.0 predecessor:
* Supports Red Hat Enterprise Linux AS 5 (RHEL5) for IBM POWER and SUSE Linux Enterprise Server 10 Service Pack 1 (SLES10 SP1) for IBM POWER


Pues bien, esto nunca sucedió y el error seguía apareciendo...hasta que un DBA me dijo que parchara y que llevará el motor 10.2.0.1 a una versión 10.2.0.5.

Lo primero que hice fue instalar el motor y darle a todos los errores de compilación un gratificante y relajado "IGNORE"...hasta que se completo la instalación , el problema es que los ejecutables por ejemplo sqlplus quedaban con un size de 0 bytes y aunque intente un relink manual con el comando

$ORACLE_HOME/bin/relink all

Todo siguió tal cual :(

Una vez instalado el motor 10.2.0.1 , lo que hice fue simplemente parchar a 10.2.0.5 y ohhh 88| , milagrosamente el precompilador si funcionaba e instalo todo perfectamente .


Problema 5 : Problema con la ejecución de SQL*Plus
Al momento de ejecutar SQL*Plus (muy confiado) aparece otro error y esta vez relacionado a temas de seguridad

[oracle@prod ~]$ sqlplus '/as sysdba'
sqlplus: error while loading shared libraries: /u01/app/oracle/product/10.2.0/db_1/lib/libnnz11.so: cannot restore segment prot after reloc: Permission denied


¿A qué se debe lo anterior? Pues a SELINUX (Security-Enhanced Linux), este es un módulo de seguridad del Kernel de Linux que entre otras cosas realiza el chequeo de los accesos a archivos de sistema.

SELinux estaba en modo restringido y había que cambiarlo a modo permisivo, para ello se debe realizar simplemente lo siguiente (con root)

setenforce 0


Y después de todo lo anterior....pues por fin pude instalar un motor 10.2.0.5 de 64 bits sobre un RHEL 5.9 para máquinas P Series (POWER)

No fue tan complicado :>>

by Ligarius
30.05.14. 11:05:06. 965 words, 6008 views. Categories: Base de datos, Instalación ,

<< 1 2 3 4 5 6 7 8 9 10 11 ... 44 >>