Categories: Base de datos, Oracle 10g, Oracle 11g, Oracle11gR2, Oracle 12c

Oracle 12c New Features : SQL Loader Express



Siempre lo más complicado de cargar datos mediante SQL Loader, es general el archivo de control.. pues bien, eso hoy tiene una solución rápida y sencilla



Imaginate una situación así.

- Un archivo CSV con la siguiente estructura si lo abrimos mediante un notepad


- Y si lo vemos a través de Microsoft Excel


Pues bien , generar el archivo de control , debería ser algo así

OPTIONS(EXTERNAL_TABLE=EXECUTE, TRIM=LRTRIM)
LOAD DATA
INFILE 'objetos.csv'
APPEND
INTO TABLE OBJETOS
FIELDS TERMINATED BY ","
(
NOMBRE,
EDAD,
DIRECCION
)


Esto podría ser sencillo para un archivo más pequeño, pero imagínense un archivo más grande, con muchos más campos o estructuras más complejas, en esta actividad, en crear el archivo CTL podemos ocupar varias horas, con pruebas y errores.

Pues bien.. desde Oracle 12c, existe una característica que nos permite realizar la carga de un archivo sin necesidad del archivo de control, esta característica se llama SQL LOADER EXPRESS.

¿Cómo funciona? Pues bien, mediante ejemplos probaremos su funcinamiento

- Ejecutamos el comando de la forma más básica

sqlldr usuario/password tabla=nombre_tabla


Con lo anterior , se cumplirá lo siguiente :

- SQL Loader tratará de cargar un archivo llamado nombre_tabla.dat, es lo que buscará mediante la creación de una tabla externa.
- SQL Loader asumirá los campos y tipos que posea la tabla nombre_tabla dentro de nuestra base de datos.
- Se generará por defecto un archivo de control, esto lo podemos ver si buscamos en el archivo nombre_tabla.log
- Si existen registros malos, que no se puedan cargar, se creará por defecto un archivo llamado nombre_tabla.bad
- El formato de las fechas está dado por el seteo NLS existente, el sabrá si se asume YYYY-MM-DD o DD-MM-YYYY.
- Si la tabla posee datos, SQL Loader simplemente cargará los datos al final de los registros existentes (APPEND).

Si quisieramos cargar los datos expuestos en las primeras líneas, simplemente deberíamos ejecutar el comando

sqlldr usuario/pwd table=objetos data=objetos.csv

Y el comando generaría el siguiente archivo de log

SQL*Loader: Release 12.1.0.2.0 - Production on Sáb Ago 22 19:23:49 2015

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Express Mode Load, Table: OBJETOS
Data File:      objetos.csv
  Bad File:     objetos_%p.bad
  Discard File:  none specified
 
 (Allow all discards)

Number to load: ALL
Number to skip: 0
Errors allowed: 50
Continuation:    none specified
Path used:      External Table

Table OBJETOS, loaded from every logical record.
Insert option in effect for this table: APPEND

   Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
NOMBRE                              FIRST     *   ,       CHARACTER            
EDAD                                 NEXT     *   ,       CHARACTER            
DIRECCION                            NEXT     *   ,       CHARACTER            

Generated control file for possible reuse:
OPTIONS(EXTERNAL_TABLE=EXECUTE, TRIM=LRTRIM)
LOAD DATA
INFILE 'objetos.csv'
APPEND
INTO TABLE OBJETOS
FIELDS TERMINATED BY ","
(
  NOMBRE,
  EDAD,
  DIRECCION
)
End of generated control file for possible reuse.

created temporary directory object SYS_SQLLDR_XT_TMPDIR_00000 for path C:\Hector

enable parallel DML: ALTER SESSION ENABLE PARALLEL DML

creating external table "SYS_SQLLDR_X_EXT_OBJETOS"

CREATE TABLE "SYS_SQLLDR_X_EXT_OBJETOS" 
(
  "NOMBRE" VARCHAR2(100),
  "EDAD" NUMBER,
  "DIRECCION" VARCHAR2(100)
)
ORGANIZATION external 
(
  TYPE oracle_loader
  DEFAULT DIRECTORY SYS_SQLLDR_XT_TMPDIR_00000
  ACCESS PARAMETERS 
  (
    RECORDS DELIMITED BY NEWLINE CHARACTERSET WE8MSWIN1252
    BADFILE 'SYS_SQLLDR_XT_TMPDIR_00000':'objetos_%p.bad'
    LOGFILE 'objetos_%p.log_xt'
    READSIZE 1048576
    FIELDS TERMINATED BY "," LRTRIM 
    REJECT ROWS WITH ALL NULL FIELDS 
    (
      "NOMBRE" CHAR(255),
      "EDAD" CHAR(255),
      "DIRECCION" CHAR(255)
    )
  )
  location 
  (
    'objetos.csv'
  )
)REJECT LIMIT UNLIMITED

executing INSERT statement to load database table OBJETOS

INSERT /*+ append parallel(auto) */ INTO OBJETOS 
(
  NOMBRE,
  EDAD,
  DIRECCION
)
SELECT 
  "NOMBRE",
  "EDAD",
  "DIRECCION"
FROM "SYS_SQLLDR_X_EXT_OBJETOS"

dropping external table "SYS_SQLLDR_X_EXT_OBJETOS"

Table OBJETOS:
  4 Rows successfully loaded.

Run began on Sáb Ago 22 19:23:49 2015
Run ended on Sáb Ago 22 19:23:50 2015

Elapsed time was:     00:00:00.82
CPU time was:         00:00:00.03

La documentación
http://www.oracle.com/technetwork/database/enterprise-edition/learnmore/sqlldr-express-mode-wp-1991038.pdf

Espero les sirva

by Ligarius
22.08.15. 17:33:16. 664 words, 4604 views. Categories: Oracle 12c , • Send a trackback »

Oracle 12c New Features : Comando VALIDATE de RMAN



En Oracle 12c existe un comando que nos puede hacer la vida muy sencilla, o ayudar en que sea más placentera.



El comando VALIDATE para RMAN (Recovery Manager), este comando puede hacer variadas cosas de utilidad para realizar chequeo de corrupción a nivel lógico de bloques (intrablock, o internamente de un sólo bloque) , como a nivel físico de bloques (interblock, o entre bloques).

Cada vez que se ejecuta el comando VALIDATE se chequea de forma manual alguna corrupción lógica o física , cada vez que ejecutamos una validación de por lo menos un datafile, RMAN chequea cada uno de los bloques del archivo y si en este análisis encuentra un bloque corrupto lógica o físicamente , se procede a actualizar la vista V$DATABASE_BLOCK_CORRUPTION, en esta vista queda inscrito el bloque que presenta problemas.

Lo que contiene el presente post.

  • Validación de datafiles
  • Validación de algún bloque en partícular de una datafile
  • Validación de base de datos completa
  • Validación de backupsets
  • Validación por secciones de datafiles

    El detalle de lo comentado :

  • Validación de datafiles : Para realizar el chequeo completo de un datafile, se ejecuta el siguiente comando, el cual arroja entre otras cosas la cantidad de bloques examinados y el valor del SCN más alto encontrado.

    VALIDATE DATAFILE "número datafile";

    Salida del comando :

    RMAN> validate datafile 1;

    Starting validate at 30/05/15
    using channel ORA_DISK_1
    channel ORA_DISK_1: starting validation of datafile
    channel ORA_DISK_1: specifying datafile(s) for validation
    input datafile file number=00001 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\O1_MF_SYSTEM_BDONOH43_.DBF
    channel ORA_DISK_1: validation complete, elapsed time: 00:00:15

    List of Datafiles
    =================
    File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
    ---- ------ -------------- ------------ --------------- ----------
    1    OK     0              18958        104974          18064429
      File Name: C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\O1_MF_SYSTEM_BDONOH43_.DBF
      Block Type Blocks Failing Blocks Processed
      ---------- -------------- ----------------
      Data       0              68354
      Index      0              13822
      Other      0              3826

    channel ORA_DISK_1: starting validation of datafile
    channel ORA_DISK_1: specifying datafile(s) for validation
    including current control file for validation
    including current SPFILE in backup set
    channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
    List of Control File and SPFILE
    ===============================
    File Type Status Blocks Failing Blocks Examined
    ------------ ------ -------------- ---------------
    SPFILE OK 0 2
    Control File OK 0 612
    Finished validate at 30/05/15

    RMAN>



  • Validación de algún bloque en partícular de una datafile : También se puede realizar el chequeo de un sólo bloque dentro de un datafile, quizás por que en el archivo de alertas o un aplicativo nos indico que allí existe una corrupción.

    VALIDATE DATAFILE "número datafile" block "número de bloque";

    Salida del comando :

    RMAN> validate datafile 7 block 1;

    Starting validate at 30/05/15
    using channel ORA_DISK_1
    channel ORA_DISK_1: starting validation of datafile
    channel ORA_DISK_1: specifying datafile(s) for validation
    input datafile file number=00007 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
    List of Datafiles
    =================

    
    File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
    ---- ------ -------------- ------------ --------------- ----------
    7    OK     0              0            1               0
      File Name: C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
      Block Type Blocks Failing Blocks Processed
      ---------- -------------- ----------------
      Data       0              0
      Index      0              0
      Other      0              1
    

    Finished validate at 30/05/15





  • Validación de base de datos completa : En la validación de la base de datos completa, simplemente se le indica que el VALIDATE será a nivel de base y el genera un informe con todos los bloques que ha recorrido y a que datafile corresponde.

    VALIDATE DATABASE;

    Salida del comando :

    RMAN> validate database;

    Starting validate at 30/05/15
    using channel ORA_DISK_1
    channel ORA_DISK_1: starting validation of datafile
    channel ORA_DISK_1: specifying datafile(s) for validation
    input datafile file number=00007 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    ****Muestra todos los datafiles que están siendo analizados

    channel ORA_DISK_1: validation complete, elapsed time: 00:01:05

    **** Muestra un resumen por cada uno de los datafiles que han sido analizados, mostrando la cantidad de bloques procesados, con problemas y el tipo de bloques.


    List of Datafiles
    =================
    File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
    ---- ------ -------------- ------------ --------------- ----------
    7 OK 0 129369 131072 18061221
    File Name: C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    Block Type Blocks Failing Blocks Processed
    ---------- -------------- ----------------
    Data 0 1542
    Index 0 0
    Other 0 161



  • Validación de backupsets : Se le puede indicar un número de backupsets para que sea analizado y nos muestra la misma información que los comandos anteriores, por ejemplo, la cantidad de bloques que ha leído y el máximo SCN que posee el datafile, con esto podemos validar que nuestro backupset es válido para realizar una restauración.

    VALIDATE BACKUPSET "número backupset" ;

    Salida del comando :

    RMAN> validate backupset 1;

    Starting validate at 31/05/15
    using channel ORA_DISK_1
    channel ORA_DISK_1: starting validation of datafile backup set
    channel ORA_DISK_1: reading from backup piece C:\ORACLE12C\FAST_RECOVERY_AREA\PROD12C\BACKUPSET\2015_05_30\O1_MF_NNNDF_TAG20150530T205937_BPNMQ9WG_.BKP
    channel ORA_DISK_1: piece handle=C:\ORACLE12C\FAST_RECOVERY_AREA\PROD12C\BACKUPSET\2015_05_30\O1_MF_NNNDF_TAG20150530T205937_BPNMQ9WG_.BKP tag=TAG20150530
    7
    channel ORA_DISK_1: restored backup piece 1
    channel ORA_DISK_1: validation complete, elapsed time: 00:00:15
    Finished validate at 31/05/15

    RMAN>



  • Validación por secciones de datafiles : Podemos realizar la validación de un datafile , pero si este es muy grande , podemos dividir el trabajo en canales por paralelo, simplemente indicando un número o tamaño de sección para el datafile. Imaginense que poseen un sólo datafile de 100GB, pues bien un sólo canal será capaz de tomarlo y procesarlo, pero si lo dividimos en secciones de 10Gb, podríamos tener hasta 10 canales procesando las 10 partes de nuestro gran datafile.

    RUN
    {
    *** Se declaran los canales que serán utilizados para que en paralelo se tome un sólo datafile
    ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
    ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
    ALLOCATE CHANNEL c2 DEVICE TYPE DISK;

    *** Se le indica el tamaño de la sección a analizar por cada canal generado
    VALIDATE DATAFILE 7 SECTION SIZE 200M;
    }

    Salida del comando :

    RMAN> run
    2> {
    3> allocate channel c1 device type disk;
    4> allocate channel c2 device type disk;
    5> allocate channel c3 device type disk;
    6> validate datafile 7 section size 200m;
    7> }

    released channel: ORA_DISK_1
    allocated channel: c1
    channel c1: SID=7 device type=DISK

    allocated channel: c2
    channel c2: SID=367 device type=DISK

    allocated channel: c3
    channel c3: SID=6 device type=DISK

    *** Se muestran todas las secciones que serán analizadas por cada canal declarado en RMAN
    Starting validate at 30/05/15
    channel c1: starting validation of datafile
    channel c1: specifying datafile(s) for validation
    input datafile file number=00007 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    validating blocks 1 through 25600
    channel c2: starting validation of datafile
    channel c2: specifying datafile(s) for validation
    input datafile file number=00007 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    validating blocks 25601 through 51200
    channel c3: starting validation of datafile
    channel c3: specifying datafile(s) for validation
    input datafile file number=00007 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    validating blocks 51201 through 76800
    channel c1: validation complete, elapsed time: 00:00:08
    channel c1: starting validation of datafile
    channel c1: specifying datafile(s) for validation
    input datafile file number=00007 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    validating blocks 76801 through 102400
    channel c2: validation complete, elapsed time: 00:00:09
    channel c2: starting validation of datafile
    channel c2: specifying datafile(s) for validation
    input datafile file number=00007 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    validating blocks 102401 through 128000
    channel c1: validation complete, elapsed time: 00:00:03
    channel c1: starting validation of datafile
    channel c1: specifying datafile(s) for validation
    input datafile file number=00007 name=C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
    validating blocks 128001 through 131072
    channel c3: validation complete, elapsed time: 00:00:11
    channel c2: validation complete, elapsed time: 00:00:04
    channel c1: validation complete, elapsed time: 00:00:01
    List of Datafiles
    =================

    File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
    ---- ------ -------------- ------------ --------------- ----------
    7    OK     0              129369       131067          18061221
      File Name: C:\ORACLE12C\ORADATA\PROD12C\DATAFILE\DATOS01_01.DBF
      Block Type Blocks Failing Blocks Processed
      ---------- -------------- ----------------
      Data       0              1542
      Index      0              0
      Other      0              156

    Finished validate at 30/05/15
    released channel: c1
    released channel: c2
    released channel: c3




    En definitiva, el comando VALIDATE es muy poderoso para realizas chequeos rápidos y certeros sobre las condiciones de nuestros respaldos y de nuestras bases de datos, buscando de manera óptima los posibles bloques corruptos, ya sea , física como lógicamente.

    Documentación del comando VALIDATE
    https://docs.oracle.com/database/121/BRADV/rcmvalid.htm#BRADV90063
    https://docs.oracle.com/database/121/RCMRF/rcmsynta2025.htm#RCMRF162

  • by Ligarius
    30.05.15. 21:24:20. 1427 words, 5558 views. Categories: Oracle 12c, RMAN (Recovery Manager) ,

    ORA-01180: can not create datafile 1



    Oracle y la reencarnación



    Hola... estoy haciendo una restauración de base de datos en versión 10.2.0.5 , desde un respaldo en disco hacía otro servidor mediante RMAN, pues bien al momento de ejecutar el restore database , me aparece el siguiente error

    released channel: c10
    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of restore command at 03/09/2015 20:42:44
    ORA-01180: can not create datafile 1
    ORA-01110: data file 1: '+DATA7/prodstb/datafile/system.261.864565123'



    No entendía muy bien lo que sucedía por ende comencé a chequear permisos en el ASM, espacios disponibles, etc. pero nada de eso funcionó.

    Y leyendo en algunos foros, me encontré con que se debía revisar la encarnación de la base de datos.

    Por ende ejecute lo siguiente :

    RMAN> list incarnation;

    using target database control file instead of recovery catalog

    List of Database Incarnations
    DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
    ------- ------- -------- ---------------- --- ---------- ----------
    1 1 FABAN9I 657905531 PARENT 1 29-SEP-11
    2 2 FABAN9I 657905531 PARENT 10527080885702 22-NOV-14
    3 3 FABAN9I 657905531 CURRENT 10554962866540 17-FEB-15


    Y se resetea la encarnación a la anterior de a la actual, este comando se utiliza para cuando se necesita hacer un restore de una base de datos a un SCN anterior que el actual

    RMAN> reset database to incarnation 2;

    database reset to incarnation 2


    Y al momento de consultarla nuevamente

    RMAN> list incarnation;

    List of Database Incarnations
    DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time
    ------- ------- -------- ---------------- --- ---------- ----------
    1 1 FABAN9I 657905531 PARENT 1 29-SEP-11
    2 2 FABAN9I 657905531 CURRENT 10527080885702 22-NOV-14
    3 3 FABAN9I 657905531 ORPHAN 10554962866540 17-FEB-15


    La encarnación con errores quedo como ORPHAN y la que reseteamos , quedo como CURRENT

    La restauración en estos momentos se está ejecutando sin problemas...

    Cosas de Oracle ;)

    Documentación
    http://docs.oracle.com/cd/E11882_01/backup.112/e10643/rcmsynta2007.htm#RCMRF148

    by Ligarius
    09.03.15. 18:33:04. 305 words, 5965 views. Categories: Base de datos, RMAN (Recovery Manager) , • Send a trackback »

    Chequeo y configuración de Oracle EM Express 12c (Enterprise Manager Express)



    ¿Qué es EM Express 12c?



    Enterprise Manager Express o comúnmente llamado EM Express, es una pieza de software que nació en Oracle12c, es una herramienta que sirve para realizar monitoreo a la base de datos mediante una interfaz WEB , la gracia principal de este EM Express es que está construida internamente en la base de datos Oracle y sólo utiliza estructuras internas de la base para su ejecución, por ejemplo el esquema XDB y SQL*Net.

    No requiere de ningún componente de Midle-Tier como por ejemplo Weblogic, no tiene repositorio de datos como un esquema sysman para Grid Control, tampoco tiene un componente instalado que pueda ser encontrado en la tabla DBA_REGISTRY, no tiene ni un proceso background asociado, todo lo anterior hace que sea una herramienta muy liviana que sólo obtiene datos desde la mísmisima base de datos. Si la base de datos no está abierta, pues simplemente está herramienta no funciona.

    Si deseas utilizarla y te diste cuenta que no funciona, pues he acá la receta de como dejarla habilitada :

    1.- Chequeamos cual es la URL de nuestra instalación de EM Express, para ello podemos ejecutar uno de los siguientes comandos, tanto para la conexión HTTP, como para la conexión HTTPS

    Para HTTPS :

    SQL> SELECT 'https://'||SYS_CONTEXT('USERENV','SERVER_HOST')||'.'||SYS_CONTEXT('USERENV','DB_DOMAIN')||':'||dbms_xdb_config.gethttpsport()||'/em/' from dual;
    SQL> SELECT 'https://'||SYS_CONTEXT('USERENV','SERVER_HOST')||':'||dbms_xdb_config.gethttpsport()||'/em/' from dual;

    Para HTTP :

    SQL> SELECT 'http://'||SYS_CONTEXT('USERENV','SERVER_HOST')||'.'||SYS_CONTEXT('USERENV','DB_DOMAIN')||':'||dbms_xdb_config.gethttpport()||'/em/' from dual;
    SQL> SELECT 'http://'||SYS_CONTEXT('USERENV','SERVER_HOST')||':'||dbms_xdb_config.gethttpport()||'/em/' from dual;



    Ejemplo de resultados de las consultas :

    SQL> SELECT 'https://'||SYS_CONTEXT('USERENV','SERVER_HOST')||':'||dbms_xdb_config.gethttpsport()||'/em/' from dual;

    'HTTPS://'||SYS_CONTEXT('USERENV','SERVER_HOST')||':'||DBMS_XDB_CONFIG.GETHTTPSPORT()||'/EM/'
    --------------------------------------------------------------------------------------------------------------------
    https://ligarius-note:5500/em/



    2.- Ejecutamos esta URL en nuestro Browser favorito (Google Chrome) y si no resulta, pues continuamos con los siguientes pasos :



    3.- Chequeamos el puerto que está utilizando nuestro servicio de listener

    Si es distinto al 1521 (puerto por defecto), tenemos que configurar el parámetro LOCAL_LISTENER con la entrada correcta del TNSNAMES, la cual debe estar apuntando a este listener, he aquí el ejemplo :

    TNSNAMES que apunta al correcto puerto de nuestro listener .

    PROD12C =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = Ligarius-Note)(PORT = 1525))
    )
    (CONNECT_DATA =
    (SERVICE_NAME = prod12c)
    )
    )


    Nos cercioramos que funcione haciendo un "tnsping PROD12C"


    Seteamos el valor a LOCAL_LISTENER

    SQL> alter system set local_listener=PROD12C scope=both;

    System altered.


    4.- Validamos la nueva entrada de servicio en el listener que está en ejecución


    Para esto se debe tener en cuenta reiniciar el listener.


    5.- Habilitar los Dispatchers, para ello se debe agregar la siguiente línea al archivo de inicialización de la base de datos.

    dispatchers="(PROTOCOL=TCP)(SERVICE=XDB )"

    Donde sid es el nombre de la base de datos.

    ando :

    SQL> alter system set dispatchers="(PROTOCOL=TCP)(SERVICE=prod12cXDB )";
    System altered.

    SQL> show parameter dispatcher

    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    dispatchers string (PROTOCOL=TCP)(SERVICE=prod12cXDB )


    6.- Resetamos el puerto donde escuchará nuestro EM Express, esto lo debemos hacer con el usuario SYS

    exec DBMS_XDB_CONFIG.SETHTTPSPORT(5500);
    exec DBMS_XDB_CONFIG.SETHTTPPORT(4500);

    Obs : Deben saber bien que puertos utilizar..


    7.- Se chequea que la opción de XML este disponible en la base de datos y de que no haya objetos inválidos asociados.Para ello ejecutamos las siguientes consultas :

    col comp_name for a20
    col version for a15

    SQL> select comp_name, version, status from dba_registry where comp_id = 'XDB';

    SQL> select owner, object_name, object_type, status from dba_objects where status = 'INVALID' and owner in ('SYS', 'XDB');




    8.- Después de lo anterior, simplemente ingresamos la URL y disfrutamos de nuestra consola de EM Express

    En este link encontrarán la nota Oracle dedicada a los problemas con EM Express 12, se los adjunto como PDF

    Troubleshooting Why EM Express is not Working (Doc ID 1604062.1)



    Espero les sirva..

    by Ligarius
    09.09.14. 12:44:29. 724 words, 14459 views. Categories: Oracle 12c ,

    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, 5672 views. Categories: Base de datos ,

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